您的位置:首页 > 其它

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

2011-03-29 09:07 357 查看
Android提供了两种主要的异步操作方法:

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

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

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

view sourceprint?

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.
AsyncClassasync =
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了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: