读书人

AsyncTask 的施行顺序很重要

发布时间: 2012-08-25 10:06:20 作者: rapoo

AsyncTask 的执行顺序很重要

?

@Overrideprotected ListAdapter initListViewAdapter() {Log.e("--------------", "执行--0");new AsynchTaskRequestData().execute();Log.e("--------------", "执行--99");mAdapter = new DailContactAdapter(this, cInfos, listTag);Log.e("--------------", "执行--100");return mAdapter;}private class AsynchTaskRequestData extends AsyncTask<Integer, Void, List<ContactInfo>> {@Overrideprotected List<ContactInfo> doInBackground(Integer... params) {Log.e("--------------", "执行--1");try {Log.e("--------------", "执行--2");Thread.sleep(PtasApplication.THREAD_SLEEP_TIME);} catch (InterruptedException e) {Log.e(DailContact.this.getClass().getName(), "InterruptedException", e);}Log.e("--------------", "执行--3");return ContactHolder.getContactInfosSort(DailContact.this, getWhere(), getOrder(), listTag);}@Overrideprotected void onPreExecute() {Log.e("--------------", "执行--4");commonList.addFooterView(loadingView);}@Overrideprotected void onPostExecute(List<ContactInfo> currentCInfos) {Log.e("--------------", "执行--5");if (cInfos.size() == 0) {displayText.setVisibility(View.VISIBLE);}if (currentCInfos.size() == 0) {if (cInfos.size() == 0) {displayText.setVisibility(View.VISIBLE);}commonList.removeFooterView(loadingView);return;}displayText.setVisibility(View.GONE);Log.e("--------------", "执行--6");cInfos.addAll(currentCInfos);mAdapter.notifyDataSetChanged();mAdapter.initSections(currentCInfos);sections = mAdapter.getSections();commonList.removeFooterView(loadingView);Log.e("--------------", "执行--7");}}

?日志记录如下:

12-08 01:00:16.854: E/--------------(571): 执行--012-08 01:00:16.873: E/--------------(571): 执行--412-08 01:00:16.894: E/--------------(571): 执行--9912-08 01:00:16.894: E/--------------(571): 执行--10012-08 01:00:16.923: E/--------------(571): 执行--112-08 01:00:16.923: E/--------------(571): 执行--212-08 01:00:18.724: I/MapActivity(571): Handling network change notification:CONNECTED12-08 01:00:18.724: E/MapActivity(571): Couldn't get connection factory client12-08 01:00:18.924: E/--------------(571): 执行--312-08 01:00:27.484: D/dalvikvm(571): GC_FOR_MALLOC freed 9497 objects / 335464 bytes in 85ms12-08 01:00:34.383: D/dalvikvm(571): GC_FOR_MALLOC freed 12655 objects / 473528 bytes in 75ms12-08 01:00:38.203: D/dalvikvm(571): GREF has increased to 20112-08 01:00:40.334: E/--------------(571): 执行--512-08 01:00:40.334: E/--------------(571): 执行--612-08 01:00:40.684: E/--------------(571): 执行--712-08 01:00:42.954: D/dalvikvm(571): GC_FOR_MALLOC freed 12275 objects / 499120 bytes in 71ms

?

结论:如果要在Adapter中处理一些数据,并且将其放在了new Adapter()的构造方法中,这是很危险的,因为在数据还没有处理完成的时候,Adapter 已经被new出来了,在对其进行的后续操作都是都是null。

?

?

结论:执行顺序 onPreExecute-->doInBackground-->onPostExecute AsyncTask<Integer, Void, List<ContactInfo>>第一个是指 doInBackground中接收的参数的类型 第二个是指onProgressUpdate中接收的参数的类型 第三个是每日doInBackground返回值的类型以及onPostExecute接收的参数的类型 
?

?

读书人网 >移动开发

热点推荐