当前位置:操作系统 > 安卓/Android >>

Android 中 AsyncTask 的使用

项目中存在复杂的后台操作且不能影响ui线程显示效果,因些就有很多事情需要后台处理。因此android中提出单线程模型开发。
 
 
 
在开发Android应用时必须遵守单线程模型的原则: 
Android UI 操作并不是线程安全的并且这些操作必须在UI线程中执行。
 
 
在单线程模型中始终要记住两条法则:
1、不要阻塞UI线程 
2、确保只在UI线程中访问Android UI工具包
当一个程序第一次启动时,Android会同时启动一个对应的主线程,主线程主要负责处理与UI相关的事件,
如:用户的按键事件,用户接触屏幕的事件以及屏幕绘图事件,并把相关的事件分发到对应的组件进行处理。
所以主线程通常又被叫做UI线程。
 
 
 
而在Android中实现异步任务的机制有两种方式: Handler 及 AsyncTask 
 
Handler方式:
需要为每一个任务创建一个新的线程,任务完成后通过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;  
    }  
  
    @Override  
    protected void onPreExecute() {  
        Log.i(TAG, "onPreExecute called");  
        cb.onAsyncResult(PRE_EVENT, "loading...");  
    }  
  
    @Override  
    protected void onPostExecute(String result) {  
        Log.i(TAG, "onPostExecute called: result : " + result);  
        cb.onAsyncResult(POST_EVENT, result);  
    }  
  
    @Override  
    protected void onCancelled() {  
        Log.i(TAG, "onCancelled called");  
        cb.onAsyncResult(CACEL_EVENT, "cancle loading");  
    }  
  
    @Override  
    protected void onProgressUpdate(Integer... values) {  
        Log.i(TAG, "onProgressUpdate called progress:" + values[0]);  
        cb.onAsyncProcess(values[0]);  
    }  
  
    // doInBackground方法内部执行后台任务  
    @Override  
    protected 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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,