代码之家  ›  专栏  ›  技术社区  ›  Brad

避免ProgressDialog和AsyncTask的样板文件?

  •  2
  • Brad  · 技术社区  · 6 年前

    我有一个包含许多活动的应用程序,其中很多都会点击各种jsonwebapi来加载&显示数据。常见模式类似于:

    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
                }
            });
        }
    }
    

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

    if (!pd.isShowing()) {
        return;
    }
    

    这修复了某些设备上的崩溃,但没有修复其他设备上的崩溃,并且我们仍然得到关于泄漏视图的logcat错误。

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

    我试过了 MyActivity.this.isDestroyed() ,它修复了崩溃,但只在sdk17+上工作,仍然得到logcat错误。

    要真正解决这个问题,唯一的选择是将“我的进度”对话框设为成员变量并重写 OnDestroy() :

    ProgressDialog mPd;
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mProgressDialog != null) {
            mProgressDialog.dismiss();
            mProgressDialog = null;
        }
    }
    

    mProgressDialog == null .

    OnDestroy()

    我没有看到更好的选择,但是在我开始更新很多活动之前,我想听听别人的意见。

    1 回复  |  直到 6 年前
        1
  •  1
  •   nupadhyaya    6 年前

    创建一个活动,比如NetworkBaseActivity。在此活动中创建ProgressDialog和handle onDestroy。同时创建一个名为 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{
    
    }