`
BestUpon
  • 浏览: 290091 次
  • 性别: Icon_minigender_1
  • 来自: 兰州
社区版块
存档分类
最新评论

AsyncTask 的执行顺序很重要

阅读更多

 

@Override
	protected 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>> {

		@Override
		protected 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);
		}

		@Override
		protected void onPreExecute() {

			Log.e("--------------", "执行--4");
			commonList.addFooterView(loadingView);
		}

		@Override
		protected 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): 执行--0
12-08 01:00:16.873: E/--------------(571): 执行--4
12-08 01:00:16.894: E/--------------(571): 执行--99
12-08 01:00:16.894: E/--------------(571): 执行--100
12-08 01:00:16.923: E/--------------(571): 执行--1
12-08 01:00:16.923: E/--------------(571): 执行--2
12-08 01:00:18.724: I/MapActivity(571): Handling network change notification:CONNECTED
12-08 01:00:18.724: E/MapActivity(571): Couldn't get connection factory client
12-08 01:00:18.924: E/--------------(571): 执行--3
12-08 01:00:27.484: D/dalvikvm(571): GC_FOR_MALLOC freed 9497 objects / 335464 bytes in 85ms
12-08 01:00:34.383: D/dalvikvm(571): GC_FOR_MALLOC freed 12655 objects / 473528 bytes in 75ms
12-08 01:00:38.203: D/dalvikvm(571): GREF has increased to 201
12-08 01:00:40.334: E/--------------(571): 执行--5
12-08 01:00:40.334: E/--------------(571): 执行--6
12-08 01:00:40.684: E/--------------(571): 执行--7
12-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接收的参数的类型 
 

 

分享到:
评论

相关推荐

    android任务后台处理 asyncTask封装

    此外,从Android 3.0(API级别11)开始,`AsyncTask`的执行策略有所改变,多个相同`AsyncTask`实例可能会并发执行,而非按顺序执行,因此在高版本Android中应特别注意这一点。 总的来说,`AsyncTask`是Android...

    android asyncTask

    从Android 3.0(API Level 11)开始,`AsyncTask`默认是在一个单线程池中执行,这可能导致任务顺序执行而非并行。为了解决这个问题,开发者可以选择自定义线程池或者使用其他异步处理框架,如`Handler`、`Loader`、`...

    Android开发之AsyncTask机制及使用细节例子源码

    这意味着如果你尝试并发执行多个AsyncTask,它们将按照队列顺序依次执行。 3. **版本兼容性**:自Android 3.0(API级别11)开始,AsyncTask默认在单独的线程池中执行,而在早期版本中,它们默认在主线程中执行。...

    使用AsyncTask提高android线程的效率

    2. **版本兼容性**:从Android 3.0(API级别11)开始,`AsyncTask`的执行默认是在单线程模式下,即所有任务都会顺序执行。如果需要多线程执行,需在应用清单文件中声明`android:targetSdkVersion`为11或更高。 3. **...

    AsyncTask 源码解析

    AsyncTask 是 Android 开发中常用的一个轻量级异步任务处理框架,主要用于在后台线程执行耗时操作,然后在 UI 线程更新界面。它简化了多线程编程,使得开发者能够更加便捷地处理异步任务。本文将深入探讨 AsyncTask ...

    模范Android中的AsyncTask

    - `AsyncTask`的执行顺序不是固定的,如果有多个任务同时执行,它们可能并发或者按顺序执行,具体取决于线程池的策略。 - `AsyncTask`不适合长时间运行的任务,因为它可能被系统回收,特别是在配置更改(如屏幕...

    Android异步任务AsyncTask的简单DEMO

    - AsyncTask的执行顺序不是线性的,多个任务可能会并发执行,因此不建议在同一个Activity中大量使用AsyncTask。 - 由于Android系统的内存管理机制,当Activity销毁后,与其关联的AsyncTask可能不会被立即取消,这...

    AsyncTask异步加载图片

    - 大量并发的`AsyncTask`可能导致内存泄漏或性能问题,因为它们默认是按照队列顺序执行的。 - `AsyncTask`不是线程安全的,不应该在多个组件之间共享。 ### 5. AsyncTask替代方案 随着Android版本的更新,Google...

    AsyncTask异步加载使用

    在Android开发中,异步处理是一项非常重要的技术,它能够帮助我们避免主线程因为执行耗时操作而引发的UI冻结问题。AsyncTask是Android提供的一种轻量级的异步处理框架,非常适合用来进行短时间、小规模的后台任务。...

    AsyncTask实例

    AsyncTask是Android开发中用于处理轻量级异步任务的重要工具。它允许开发者在后台线程执行耗时操作,然后在UI线程更新结果,从而避免了主线程被阻塞导致应用无响应的问题。以下是对AsyncTask的详细解析: 1. **...

    异步任务AsyncTask

    默认情况下,AsyncTask会按照它们被创建的顺序串行执行,以防止UI线程被大量并发任务阻塞。如果希望并行执行任务,可以使用`executeOnExecutor()`方法,传入`AsyncTask.THREAD_POOL_EXECUTOR`来启用线程池,这将允许...

    android AsyncTask

    Android的AsyncTask是Android开发中一个非常重要的工具类,它为开发者提供了在UI线程之外执行后台任务的能力,同时能够方便地更新UI。这个工具在处理轻量级异步任务时非常有效,例如网络请求、数据库操作或者计算...

    AsyncTaskTest

    - `AsyncTask`的执行顺序是按照`execute()`的调用顺序来的,如果有多个任务排队,它们会按顺序依次执行。 - `AsyncTask`的版本在API 11后有了较大的改动,不再允许在主线程中直接实例化,这主要是为了避免内存泄漏和...

    Android 中糟糕的AsyncTask

    AsyncTask的执行顺序也是一个复杂的问题。在早期版本中,它们是按照创建顺序串行执行的。从Android 1.6开始,它们变为并行执行,以提高性能。但在Android 3.0(Honeycomb)之后,为了应对并发问题,对于同一个`...

    android线程 Handler Message Queue AsyncTask线程模型 线程交互 + 修改Button样式 示例 最终easy整合版

    此外,还可以使用AsyncTask执行一个长时间的任务,如网络请求,在完成后更新Button的背景色。 通过这样的实战练习,开发者不仅能理解各个组件的工作原理,还能掌握它们在实际开发中的应用,从而提高解决问题的能力...

    js代码-2、JS代码的执行顺序:async、promise、setTimeout

    本篇文章将深入探讨JS代码的执行顺序,特别是涉及到`async`、`Promise`和`setTimeout`这三个关键概念。 首先,我们要了解JavaScript的执行机制。JavaScript引擎采用单线程执行模型,意味着同一时间只能执行一个任务...

    Android中AsyncTask详细介绍

    关于AsyncTask的执行顺序,其行为在不同的Android版本中有变化。在1.6之前,它们是串行执行的,这意味着一个任务完成后,下一个任务才会开始。然而,从1.6到2.3,为了提高性能,AsyncTask改为并行执行。这意味着多个...

    前端面试题之deepJS-asyncTask.zip

    "deepJS-asyncTask.zip"这个压缩包文件显然是针对前端面试中JavaScript异步处理相关的问题集。在这个压缩包中,我们可能会看到一系列关于JavaScript异步编程、事件循环、回调函数、Promise、Async/Await等关键知识点...

Global site tag (gtag.js) - Google Analytics