Android 使用ProgressDialog和AsyncTask避免样板文件?

Android 使用ProgressDialog和AsyncTask避免样板文件?,android,android-activity,android-asynctask,progressdialog,Android,Android Activity,Android Asynctask,Progressdialog,我有一个包含很多活动的应用程序,其中很多都使用各种json web API来加载和显示数据。常见模式类似于: public class MyActivity extends Activity { public void OnCreate(Bundle savedInstanceState) { ... ProgressDialog pd = ProgressDialog.show( ... ); // This is a custom A

我有一个包含很多活动的应用程序,其中很多都使用各种json web API来加载和显示数据。常见模式类似于:

public class MyActivity extends Activity {
    public void OnCreate(Bundle savedInstanceState) {
        ...
        ProgressDialog pd = ProgressDialog.show( ... );

        // This is a custom API which wraps AsynkTask and calls my callback in onPostExecute
        DoWebThing(url, new Callback() {
            public void onSuccess(String json) {
                pd.dismiss();
                // Do other UI stuff with the json data
            }
        });
    }
}
这非常有效,与您在SO和教程中找到的许多代码片段类似。问题是,用户可以在后台进程运行时离开页面。在本例中,我得到一个关于泄漏视图(ProgressDialog)的logcat错误,然后当我关闭它或执行其他UI操作时,我将崩溃

我已尝试在成功时添加提前签入:

if (!pd.isShowing()) {
    return;
}
这修复了某些设备上的崩溃,但其他设备上没有,并且我们仍然得到关于泄漏视图的logcat错误

我已尝试用
MyActivity.this.isFinishing()
替换
pd.isShowing()
检查,这对任何事情都没有帮助(在我当前测试的设备上)。仍然得到logcat错误和崩溃

我已经尝试了
MyActivity.this.isDestroyed()
,它修复了崩溃,但只在SDK 17+上工作,并且仍然得到logcat错误

要真正解决此问题,唯一的选择是将“我的进度”对话框设置为成员变量,并覆盖
OnDestroy()

现在在我的回调中,我可以检查
mProgressDialog==null

这很有效。没有关于泄漏视图的崩溃和logcat错误。但这感觉像是很多样板文件——我必须让进度对话框成为一个成员变量,并在我所有(许多)做后台工作的活动中覆盖
ondestory()


我没有看到更好的选择,但在我开始更新大量活动之前,我需要第二个意见。

创建一个活动,比如NetworkBaseActivity。在此活动中创建ProgressDialog并处理onDestroy。还创建一个名为
showMyDialog()
hideMyDialog()
的方法来显示和隐藏对话框(从子类)。现在,所有做背景工作的活动只需扩展此活动。要显示对话框,请调用
showMyDialog()
,要隐藏对话框,请调用
hideMyDialog()

大概是这样的:

public class NetworkBaseActivity extends AppCompatActivity{
    ProgressDialog myDialog;
    onCreate(Bundle bundle){
        // initialize myDialog
    }

    public void showDialog(){
       // show myDialog if not shown
    }
    public void hideDialog(){
      // hide myDialog if already shown
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mProgressDialog != null) {
        mProgressDialog.dismiss();
        mProgressDialog = null;
    }
}

public class YourActivity extends NetworkBaseActivity{

}

我在stackoverflow中直接输入了代码,请原谅我的输入错误,但您明白了。

FYI最好继续使用实时数据和体系结构组件谢谢,我希望避免更改我所有活动的基类,但我同意这似乎是最好的选择。
public class NetworkBaseActivity extends AppCompatActivity{
    ProgressDialog myDialog;
    onCreate(Bundle bundle){
        // initialize myDialog
    }

    public void showDialog(){
       // show myDialog if not shown
    }
    public void hideDialog(){
      // hide myDialog if already shown
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mProgressDialog != null) {
        mProgressDialog.dismiss();
        mProgressDialog = null;
    }
}

public class YourActivity extends NetworkBaseActivity{

}