代码改变世界

AsyncTask使用方式一

2011-03-27 16:07  随风 net  阅读(192)  评论(0)    收藏  举报

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

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

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

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

1 public class MyActivity extends Activity {
2
3 protected void onCreate(Bundle savedInstanceState) {
4 // TODO Auto-generated method stub
5 super.onCreate(savedInstanceState);
6
7 //判断是否存在父Activity
8 Context c;
9 if(getParent() != null) c = getParent();
10 else c = this;
11 AsyncClass async = new AsyncClass (c);
12 async.execute();
13 }
14
15 @Override
16 protected void onResume() {
17 // TODO Auto-generated method stub
18 super.onResume();
19 }
20
21 class AsyncClass extends AsyncTask {
22 private Context context;
23 private ProgressDialog progressDlg;
24
25 public AsyncLoadData(Context c) {
26 this.context = c;
27 }
28
29 @Override
30 protected String doInBackground(Void... params) {
31 // TODO Auto-generated method stub
32 fillData();
33 return null;
34 }
35
36 protected void onPostExecute(String result) {
37 //Do some work
38 progressDlg.cancel();
39 }
40
41 protected void onPreExecute() {
42 progressDlg = new ProgressDialog(context);
43 progressDlg.setMessage("ing...");
44 progressDlg.setCancelable(false);
45 progressDlg.show();
46 }
47 }
48
49 }
主要思路很简单,就是由于是超过两层的Activity中会出问题,所以就使用父级的Context,这样就能workaround了。