Android入门笔记之AsyncTask
来源:互联网 发布:苹果mac改变用户 编辑:程序博客网 时间:2024/04/29 13:28
Android入门笔记之AsyncTask
<1>简介
多线程是android重要的机制之一。
<2>关键步骤
Android中通过AsyncTask和标准的Thread类来提供线程服务,将某些操作从主UI现呈上分离开来。
AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。AsyncTask定义了三种泛型类型 Params,Progress和Result。
* Params 启动任务执行的输入参数,比如HTTP请求的URL。
* Progress 后台任务执行的百分比。
* Result 后台执行任务最终返回的结果,比如String。
AsyncTask 的执行分为四个步骤。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。
* onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
* doInBackground(Params...) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
* onProgressUpdate(Progress...) 此方法在主线程执行,用于显示任务执行的进度。
* onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。
<3>出现的问题
无
<4>代码及解释
AsyncActivity:
package com.activity;import java.io.ByteArrayOutputStream;import java.io.InputStream;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import android.app.Activity;import android.app.ProgressDialog;import android.content.Context;import android.content.DialogInterface;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import com.test.R;public class AsyncActivity extends Activity{/** * @ProjectName: [androidtest] * @Package: [com.activity.AsyncActivity.java] * @ClassName: [AsyncActivity] * @Description: * @Author: [gmj] * @CreateDate: [2013-9-6 下午7:33:52] * @Version: [v1.0] */private TextView message; private Button open; private EditText url; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_async); message= (TextView) findViewById(R.id.async_view); url= (EditText) findViewById(R.id.async_text); open= (Button) findViewById(R.id.async_but); open.setOnClickListener(new View.OnClickListener() { public void onClick(View arg0) { connect(); } }); } private void connect() { PageTask task = new PageTask(this); task.execute(url.getText().toString()); } class PageTask extends AsyncTask<String, Integer, String> { // 可变长的输入参数,与AsyncTask.exucute()对应 ProgressDialog pdialog; public PageTask(Context context){ pdialog = new ProgressDialog(context, 0); pdialog.setButton("cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int i) { dialog.cancel(); } }); pdialog.setOnCancelListener(new DialogInterface.OnCancelListener() { public void onCancel(DialogInterface dialog) { finish(); } }); pdialog.setCancelable(true); pdialog.setMax(100); pdialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); pdialog.show(); } @Override protected String doInBackground(String... params) { try{ HttpClient client = new DefaultHttpClient(); // params[0]代表连接的url HttpGet get = new HttpGet(params[0]); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); String s = null; if(is != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[128]; int ch = -1; int count = 0; while((ch = is.read(buf)) != -1) { baos.write(buf, 0, ch); count += ch; if(length > 0) { // 如果知道响应的长度,调用publishProgress()更新进度 publishProgress((int) ((count / (float) length) * 100)); } // 让线程休眠100ms Thread.sleep(100000); } s = new String(baos.toByteArray()); } // 返回结果 return s; } catch(Exception e) { e.printStackTrace(); } return null; } @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(String result) { // 返回HTML页面的内容 message.setText(result); pdialog.dismiss(); } @Override protected void onPreExecute() { // 任务启动,可以在这里显示一个对话框,这里简单处理 message.setText("线程启动"); } @Override protected void onProgressUpdate(Integer... values) { // 更新进度 System.out.println(""+values[0]); message.setText(""+values[0]); pdialog.setProgress(values[0]); } }}
- Android入门笔记之AsyncTask
- Android 笔记之 AsyncTask
- Android学习笔记之AsyncTask
- android开发笔记之AsyncTask
- 【AsyncTask】Android AsyncTask使用入门
- Android应用开发学习笔记之AsyncTask
- Android之AsyncTask的学习笔记
- Android 入门 -- AsyncTask
- Android学习笔记:Android异步任务之AsyncTask基础
- Android学习笔记---AsyncTask
- 笔记23--android AsyncTask
- Android AsyncTask学习笔记
- Android AsyncTask 笔记
- Android学习笔记之AsyncTask实现文件下载任务
- Android开发学习笔记十四 异步线程之AsyncTask
- Android之AsyncTask轻量级异步类(笔记)
- android 线程之AsyncTask
- Android之AsyncTask介绍
- POJ 1191
- tcp通信程序
- Android Application对象必须掌握的七点
- OSI开放式系统互联
- 判断点与菱形的关系
- Android入门笔记之AsyncTask
- 简单计算器
- DNS Server 配置
- hdu 1054 Strategic Game 最小顶点覆盖(二分图最大匹配)
- 日交易41.9亿,B2B的魅力为何不输于B2C、C2C?
- local_bh_disable() 如何对 ksoftirqd和workqueue 起作用
- C++监控USB设备
- 小爱情、小幸福、一辈子
- 画动画圆之使用 QT4.6/C#/MFC/DELPHI/VB 开发的程序性能测试报告