web-dev-qa-db-ja.com

Android他のクラスでOnOnUiThreadを実行するには?

私のアプリケーションのMainActivityには、正常に動作するスレッドがあります。しかし、サーバーからデータを取得するために別のクラスを呼び出すと、スレッドで実行できません。以下のコード例を参照してください。

class MainActivity extends Activity implements Runnable {

    public void onCreate() {
        new Thread(this).start();
    }

    public void run() {
        //here is code for download data from server after completion this and in handler  i m call other class in setdata() method....
    }

    public void setData() {
        new CheckData(this);
    }
}

class CheckData {
    public CheckData(Context context) {
        context.runUIonthread(){//cant call as runUIthread............
    }
}
27

記事 Iスレッドとの通信 を参照してください。

Contextを手にすると、どのクラスでもHandlerを作成できます。それ以外の場合は、Looper.getMainLooper()を呼び出すことができます。どちらにしても、メインUIスレッドを取得できます。

例えば:

class CheckData{
    private final Handler handler;

    public Checkdata(Context context){
       handler = new Handler(context.getMainLooper());
    } 

    public void someMethod() {
       // Do work
       runOnUiThread(new Runnable() {
           @Override
           public void run() {
               // Code to run on UI thread
           }
       });
    }

    private void runOnUiThread(Runnable r) {
       handler.post(r);
    }  
}
53
Dave T.

コンテキストを渡したくない場合の解決策は次のとおりです。

new Handler(Looper.getMainLooper()).post(new Runnable() {
    public void run() {
        // code goes here
    }
});
32
The Berga
class MainActivity extends Activity implements Runnable{

    public void oncreate(){
        new Thread(this).start();
    }

    public void  run(){
        //here is code for download data from server after completion this and in handler  i m call other class in setdata() method....
    }

    public void setdata();
    {
        new checkData(this,MainActivity.this);
    }
}

class checkData{

    public void checkdata(Context context,MainActivity mainactivity){
       mainactivity.runUIonthread()..is works fine for me.....
    }   

}
12

アクティビティは、Contextを拡張するクラスです。したがって、コンテキストとアクティビティの両方を渡す必要はありません。アクティビティをコンテキストとして渡すと、次のようにコンテキストを使用してUIスレッドで実行できます。

((Activity) context).runOnUiThread(new Runnable() {
        public void run() {
            //Code goes here
        }
    });

注意事項:これは、コンテキストがアクティビティコンテキストであることが確実な場合にのみ使用し、それを想定するのは良い習慣ではありません。

11

AsyncTaskをご覧ください。それは最良の解決策ではありませんが、開始するのに役立ちます。

http://developer.Android.com/reference/Android/os/AsyncTask.html

[〜#〜] edit [〜#〜]

なぜAsyncTaskを使用するのがあなたにとって解決策ではないのか、とにかくわかりません。 UIスレッドで初期化されるHandlerクラスを保持できます。次に、このハンドラーを使用して、実行可能ファイルの形式でUIにメッセージをポストバックできます。そのため、UIスレッドにいるときに(新しいスレッドを開始する前に)新しいHandlerオブジェクトをインスタンス化し、それを他のクラスと共有するだけです。完了したら、そのインスタンスを使用して、postメソッドを使用してメッセージをUIスレッドにポストバックできます。詳細については、Handlerクラスのドキュメントをご覧ください。

http://developer.Android.com/reference/Android/os/Handler.html

6

誰かがRxベースのソリューションを探している場合:

Observable.just(true)
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(aBoolean -> {
        // cool stuff comes here
    });
2
Shaishav