如果我要定义一个对话片段,如:
public class MyDialogFragment extends DialogFragment implements
DialogInterface.OnClickListener, DialogInterface.OnShowListener,
DialogInterface.OnDismissListener {
private ProgressBar dialogProgressBar;
并将自定义AsyncTask
作为MyDialogFragment
内的内部类,如:
public static class MyAsyncTask extends AsyncTask<Void, Integer, Void> {
MyAsyncTask
访问dialogProgressBar
的最佳方式是什么?我可以制作dialogProgressBar
static
,但这意味着我的所有对话框都共享相同的进度条,这是没有意义的
同样,由于MyAsyncTask
为static
,我怎么能在onPostExecute
中忽略此对话框?
对话框启动asynctask,如下所示:
@Override public void onShow(DialogInterface dialog) {
myTask = new MyAsyncTask();
myTask.execute();
}
我将MyAsyncTask
作为STATIC内部类,否则,如果对话框被解除并因此被破坏,我就不会泄漏MyDialogFragment
。
答案 0 :(得分:1)
您可以通过以下方式将对话框作为参数传递给AsyncTask
public static class MyAsyncTask extends AsyncTask<ProgressBar, Integer, Void> {
WeakReference<ProgressBar> progressBar;
protected Void doInBackground(ProgressBar...params){
if(params!=null && params.length>0){
progressBar = new WeakReference<ProgressBar>(params[0]);
}
///do stuff
}
protected Void onPostExecute(Void result){
ProgressBar p = progressBar.get();
if(p!=null){
p.dismiss();
}
}
}
方式#2 - 您可以将ProgressBar作为类的构造函数中的参数传递
public MyAsyncTask(ProgressBar progressBar){
//save the progressbar for use in the postexecute
}