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