TabActivity下在AsyncTask中使用ProgressDialog存在问题的解决方法

Android提供了两种主要的异步操作方法:

第一种就是采用Thread执行内容,然后通过handler来获知线程结果以更新UI,但是这种方式对线程的安全性需要程序员来进行控制;

第二种是采用AsyncTask,这种方式是线程安全的,当然也意味着效率会比第一种稍低,不过还是可以接受的。

但是在TabActivity中用AsyncTask方法进行异步操作的时候,如果在超过两层的activity中使用了ProgressDialog,就会存在问题。这个大概是Android本身的bug,或者不叫bug,而是一种限制。对于这种情况,目前没有什么很好的正规解决方案,不过在大部分情况下可以采用如下workaround来解决。

public class MyActivity extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        
        //判断是否存在父Activity
        Context c;
        if(getParent() != null) c = getParent();
        else c = this;
        AsyncClass async = new AsyncClass (c);
        async.execute();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
    }
    
    class AsyncClass extends AsyncTask {
        private Context context;
        private ProgressDialog progressDlg;

        public AsyncLoadData(Context c) {
            this.context = c;
        }

        @Override
        protected String doInBackground(Void... params) {
            // TODO Auto-generated method stub
            fillData();
            return null;
        }

        protected void onPostExecute(String result) {
            //Do some work
            progressDlg.cancel();
        }

        protected void onPreExecute() {
            progressDlg = new ProgressDialog(context);
            progressDlg.setMessage("ing...");
            progressDlg.setCancelable(false);
            progressDlg.show();
        }
    }
    
}

 

posted @ 2013-08-20 17:41  一个学渣  阅读(348)  评论(0)    收藏  举报

 

CSDNGitHub 联系邮箱:aikongmeng@gmail.com


Copyright 2008-2019 Government All Rights Reserved