在AsyncTask中获取/使用Context的最佳方法是什么?

时间:2013-08-18 13:23:51

标签: android constructor android-asynctask inner-classes android-context

我通过扩展AsyncTask类来定义一个单独的线程。在这个类中,我在AsyncTask的onPostExecuteonCancelled方法中执行一些Toasts和Dialog。祝酒词需要应用程序的上下文,所以我需要做的就是:

Toast.makeText(getApplicationContext(),"Some String",1);

使用AlertDialog.Builder创建对话框,这也需要在其构造函数中使用上下文。我认为这个上下文应该是Activity的上下文吗?即。

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());  

其中getActivity可以是返回当前活动的用户定义类。如果是这样,处理这种情况的最佳方法是什么?创建一个类getActivity或将当前活动的上下文传递给AsyncTask的构造函数?

我想我正在尝试理解Context的使用 - 我注意到内存泄漏可能是一个问题(还没有真正理解这一点)以及如何使用getApplicationContext()是最好的尽可能接近。

1 个答案:

答案 0 :(得分:13)

只需将AsyncTask创建为Activity的内部类,或者将Context 传递给AsyncTask的构造函数。

内部类: MyActivity.java

public class MyActivity extends Activity {

    // your other methods of the activity here...


    private class MyTask extends AsyncTask<Void, Void, Void> {

         protected Void doInBackground(Void... param) {

             publishProgress(...);  // this will call onProgressUpdate();
         }

         protected Void onProgressUpdate(Void... prog) {

             Toast.makeText(getActivity(), "text", 1000).show(); 
         }
    }
}

构造函数: MyTask.java

public class MyTask extends AsyncTask<Void, Void, Void> {

     Context c;

     public MyTask(Context c) {
          this.c = c;
     }

     protected Void doInBackground(Void... param) {

          publishProgress(...);  // this will call onProgressUpdate();
     }

     protected Void onProgressUpdate(Void... prog) {
          Toast.makeText(c, "text", 1000).show();
     }
}

此外,请不要忘记在对话框上调用.show()

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.show();