现在的位置: 首页 > 综合 > 正文

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

2014年12月03日 ⁄ 综合 ⁄ 共 1392字 ⁄ 字号 评论关闭

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

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

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

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

01.public class MyActivity extends Activity {
02. 
03.protected void onCreate(Bundle savedInstanceState) {
04.// TODO Auto-generated method stub
05.super.onCreate(savedInstanceState);
06. 
07.//判断是否存在父Activity
08.Context c;
09.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了。

抱歉!评论已关闭.