AsyncTask使用方式一
2011-03-27 16:15 随风 net 阅读(650) 评论(0) 编辑 收藏 举报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(); } } }