29

重複の可能性:
Androidは他のクラスでOnUiThreadを実行する方法を教えてください。

MyAsynClassesは別のクラスファイルです。

public class AdamTask extends AsyncTask<String, Void, String>{
         public void showToast(final String toast)
        {
            runOnUiThread(new Runnable() {
                public void run()
                {
                    Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
                }
            });
        }
}

AsyncTaskクラスでこのメソッドを実行するにはどうすればよいですか?エラーが発生しましたメソッドrunOnUiThread(new Runnable(){}) is undefined for the type AdamTask

new AdamTask(Eve.this、How to pass the eve activity here).execute();

4

3 に答える 3

57

コンテキストをActivityクラスに型キャストするだけです

((Activity)context).runOnUiThread(new Runnable()
    {
        public void run()
        { 
             Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
        }
    });
于 2012-10-26T11:52:18.503 に答える
39

Activity's参照(名前を付けましょう)を用意して、クラスactivityに渡す必要があります。次に、次のようAsyncTaskに呼び出すことができます。runOnUiThread

activity.runOnUiThread

runOnUiThreadは、クラスで定義されたメソッドです。Activity

AsyncTaskにcontsructorを追加するだけです。AsyncTaskは次のようになります。

public class AdamTask extends AsyncTask<String, Void, String> {

private Activity activity; //activity is defined as a global variable in your AsyncTask

public AdamTask(Activity activity) {

    this.activity = activity;
}

public void showToast(final String toast)
    {
        activity.runOnUiThread(new Runnable() {
            public void run()
            {
                Toast.makeText(activity, toast, Toast.LENGTH_SHORT).show();
            }
        });
    }

...

}

次に、を呼び出すには、次のAsyncTaskようなものが必要です。

AdamTask adamTask = new AdamTask(Eve.this);
adamTask.excecute(yourParams);

更新Samがコメントで述べたように、構成の変更が発生するAsyncTaskscontextリークが発生する可能性があります(1つの例は、画面が回転してActivityが再作成される場合です)。これに対処する方法は、ヘッドレスfragmentテクニックです。

もう1つの方法は、より効率的に、イベントバスを使用することです。詳細については、ここを参照してください(コメントでSamによって提供されたリンク)。

于 2012-10-26T11:40:53.937 に答える
4

これを行うには、Activityオブジェクトが必要です。アクティビティのこの参照をコンストラクターに渡し、AsyncTaskで使用します。

public class AdamTask extends AsyncTask<String, Void, String>{
         public void showToast(final String toast)
        {
            activityObj.runOnUiThread(new Runnable() {
                public void run()
                {
                    Toast.makeText(context, toast, Toast.LENGTH_SHORT).show();
                }
            });
        }
}

runOnUiThreadはActivityクラスのパブリックメソッドであるため、Activity自体以外の拡張クラスまたは他のCustomクラスで使用することはできません。

ここを見て、runonUi。

不明な場合は、この回答を確認して、コンストラクターを介してアクティビティオブジェクトを送信する方法を確認してください

于 2012-10-26T11:35:05.943 に答える