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

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

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

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

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

01. publicclassMyActivityextendsActivity {
02.
03. protectedvoidonCreate(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. elsec =this;
11. AsyncClass async =newAsyncClass (c);
12. async.execute();
13. }
14.
15. @Override
16. protectedvoidonResume() {
17. // TODO Auto-generated method stub
18. super.onResume();
19. }
20.
21. classAsyncClassextendsAsyncTask {
22. privateContext context;
23. privateProgressDialog progressDlg;
24.
25. publicAsyncLoadData(Context c) {
26. this.context = c;
27. }
28.
29. @Override
30. protectedString doInBackground(Void... params) {
31. // TODO Auto-generated method stub
32. fillData();
33. returnnull;
34. }
35.
36. protectedvoidonPostExecute(String result) {
37. //Do some work
38. progressDlg.cancel();
39. }
40.
41. protectedvoidonPreExecute() {
42. progressDlg =newProgressDialog(context);
43. progressDlg.setMessage("ing...");
44. progressDlg.setCancelable(false);
45. progressDlg.show();
46. }
47. }
48.
49. }

主要思路很简单,就是由于是超过两层的Activity中会出问题,所以就使用父级的Context,这样就能workaround了。

你可能感兴趣的:(ProgressDialog)