Android 中 AsyncTask 的使用
项目中存在复杂的后台操作且不能影响ui线程显示效果,因些就有很多事情需要后台处理。因此android中提出单线程模型开发。在开发Android应用时必须遵守单线程模型的原则:Android UI 操作并不是线程安全的并且这些操作必须在UI线程中执行。在单线程模型中始终要记住两条法则:1、不要阻塞UI线程2、确保只在UI线程中访问Android UI工具包当一个程序第一次启动时,Android会同时启动一个对应的主线程,主线程主要负责处理与UI相关的事件,如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。所以主线程通常又被叫做UI线程。而在Android中实现异步任务的机制有两种方式: Handler 及 AsyncTaskHandler方式:需要为每一个任务创建一个新的线程,任务完成后通过Handler实例向UI线程发送消息,完成界面的更新.AsyncTask方式:使创建异步任务变得更加简单,不再需要编写任务线程和Handler实例即可完成相同的任务.Handler 的用法在 http://blog.csdn.net/andyhuabing/article/details/7368217 中已学习过了,这里只对异步任务类进行说明。AsyncTask 的定义:[java]<span style="font-size:14px">public abstract class AsyncTask<Params, Progress, Result></span>三个泛型类型分别代表“启动任务执行的输入参数”、“后台任务执行的进度”、“后台计算结果的类型”。几个重载方法说明:1、 execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。2、 onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。3、 doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。4、 onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。5、 onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。下面将 Handler 及 AsyncTask 两者在一起进行使用,给出一个实际的测试例子:首先编写一个异步任务类:注意其实例化的参数:[java]<span style="font-size:14px">AsyncTask<String, Integer, String> </span>[java]<span style="font-size:14px">package com.example.test;import java.io.ByteArrayOutputStream;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.HttpStatus;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.content.Context;import android.os.AsyncTask;import android.util.Log;public class TestAsyncTask extends AsyncTask<String, Integer, String> {static final String TAG = "testAsyncTask";AsyncTaskCallback cb = null;public static final int PRE_EVENT = 1;public static final int POST_EVENT = 2;public static final int CACEL_EVENT = 3;public static inte易做图ce AsyncTaskCallback {// 显示结果void onAsyncResult(int e, String s);// 显示进度条void onAsyncProcess(Integer pi);}public TestAsyncTask(Context c, AsyncTaskCallback cb) {this.cb = cb;}@Overrideprotected void onPreExecute() {Log.i(TAG, "onPreExecute called");cb.onAsyncResult(PRE_EVENT, "loading...");}@Overrideprotected void onPostExecute(String result) {Log.i(TAG, "onPostExecute called: result : " + result);cb.onAsyncResult(POST_EVENT, result);}@Overrideprotected void onCancelled() {Log.i(TAG, "onCancelled called");cb.onAsyncResult(CACEL_EVENT, "cancle loading");}@Overrideprotected void onProgressUpdate(Integer... values) {Log.i(TAG, "onProgressUpdate called progress:" + values[0]);cb.onAsyncProcess(values[0]);}// doInBackground方法内部执行后台任务@Overrideprotected String doInBackground(String... params) {Log.i(TAG, "doInBackground called: params : " + params[0]);try {HttpClient client = new DefaultHttpClient();HttpGet get = new HttpGet(params[0]);HttpResponse response = client.execute(get);if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {HttpEntity entity = response.getEntity();InputStream is = entity.getContent();long total = entity.getContentLength();ByteArrayOutputStream baos = new ByteArrayOutputStream();byte[] buf = new byte[512];int count = 0;int length = -1;&补充:移动开发 , Android ,
上一个:android之高德地图学习
下一个:android上传文件到服务器