我通过扩展AsyncTask
类来定义一个单独的线程。在这个类中,我在AsyncTask的onPostExecute
和onCancelled
方法中执行一些Toasts和Dialog。祝酒词需要应用程序的上下文,所以我需要做的就是:
Toast.makeText(getApplicationContext(),"Some String",1);
使用AlertDialog.Builder
创建对话框,这也需要在其构造函数中使用上下文。我认为这个上下文应该是Activity的上下文吗?即。
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
其中getActivity
可以是返回当前活动的用户定义类。如果是这样,处理这种情况的最佳方法是什么?创建一个类getActivity
或将当前活动的上下文传递给AsyncTask的构造函数?
我想我正在尝试理解Context
的使用 - 我注意到内存泄漏可能是一个问题(还没有真正理解这一点)以及如何使用getApplicationContext()
是最好的尽可能接近。
答案 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();