更新-2016
最良の選択肢は、使用することですRxAndroid
(のための具体的なバインディングをRxJava
用)P
にMVP
データFO取る担当。
Observable
既存のメソッドから戻ることから始めます。
private Observable<PojoObject> getObservableItems() {
return Observable.create(subscriber -> {
for (PojoObject pojoObject: pojoObjects) {
subscriber.onNext(pojoObject);
}
subscriber.onCompleted();
});
}
このObservableを次のように使用します-
getObservableItems().
subscribeOn(Schedulers.io()).
observeOn(AndroidSchedulers.mainThread()).
subscribe(new Observer<PojoObject> () {
@Override
public void onCompleted() {
// Print Toast on completion
}
@Override
public void onError(Throwable e) {}
@Override
public void onNext(PojoObject pojoObject) {
// Show Progress
}
});
}
-------------------------------------------------- -------------------------------------------------- ------------------------------
私は少し遅れていることを知っていますが、ここに行きます。Androidは基本的に、UIスレッドとバックグラウンドスレッドの 2つのスレッドタイプで動作します。Androidのドキュメントによると-
この問題を修正するために、UIスレッドの外部からAndroid UIツールキットにアクセスしないでください。Androidには、他のスレッドからUIスレッドにアクセスする方法がいくつかあります。役立つメソッドのリストを次に示します。
Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)
現在、この問題を解決するさまざまな方法があります。
コードサンプルで説明します。
runOnUiThread
new Thread()
{
public void run()
{
myactivity.this.runOnUiThread(new Runnable()
{
public void run()
{
//Do your UI operations like dialog opening or Toast here
}
});
}
}.start();
ルーパー
スレッドのメッセージループを実行するために使用されるクラス。デフォルトでは、スレッドにはメッセージループが関連付けられていません。メッセージを作成するには、ループを実行するスレッドでprepare()を呼び出し、次にloop()を呼び出して、ループが停止するまでメッセージを処理させます。
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
AsyncTask
AsyncTaskを使用すると、ユーザーインターフェイスで非同期作業を実行できます。ワーカースレッドでブロッキング操作を実行してから、結果をUIスレッドに公開します。スレッドやハンドラーを自分で処理する必要はありません。
public void onClick(View v) {
new CustomTask().execute((Void[])null);
}
private class CustomTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... param) {
//Do some work
return null;
}
protected void onPostExecute(Void param) {
//Print Toast or open dialog
}
}
ハンドラ
ハンドラーを使用すると、スレッドのMessageQueueに関連付けられたMessageオブジェクトとRunnableオブジェクトを送信して処理できます。
Message msg = new Message();
new Thread()
{
public void run()
{
msg.arg1=1;
handler.sendMessage(msg);
}
}.start();
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.arg1==1)
{
//Print Toast or open dialog
}
return false;
}
});
compile 'com.shamanland:xdroid-toaster:0.0.5'
必要runOnUiThread()
もContext
変数もありません。すべてのルーチンがなくなっています。Toaster.toast(R.string.my_msg);
ここで呼び出すだけです。例は次のとおり