原文:[置顶] Android菜鸟的成长笔记(13)——异步任务(Async Task)

Android的UI线程主要负责处理用户的事件及图形显示,因此主线程UI不能阻塞,否则会弹出一个ANR(Application Not Responding)异常,所以不能在UI线程中执行耗时操作。AsyncTask<>是一个抽象类,通常被继承,继承时需要指定三个泛型:
AsyncTask<Params, Progress, Result>
Params:启动任务执行的输入参数的类型
Progress:后台任务完成的进度值的类型
Result:后台执行任务完成后返回结果的类型
例子:从http://m.blog.csdn.net/blog/lxq_xsyu异步加载数据到手机上并显示(详细请看注释)
MainActivity.java
package com.example.testasyntask;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection; import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.webkit.WebView;
import android.widget.TextView; public class MainActivity extends Activity {
private TextView show;
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
show = (TextView) findViewById(R.id.textView1);
webView = (WebView) findViewById(R.id.webview);
} public void download(View source) throws MalformedURLException{
DownTask task = new DownTask(this);
task.execute(new URL("http://m.blog.csdn.net/blog/lxq_xsyu"));
} class DownTask extends AsyncTask<URL, Integer, String>{
ProgressDialog pdialog;
Context mContext;
int hasRead = 0;
public DownTask(Context ctx){
mContext = ctx;
} /**
* 该方法在执行后台耗时操作前被调用,初始化
*/
@Override
protected void onPreExecute() {
pdialog = new ProgressDialog(mContext);
pdialog.setTitle("任务正在执行中");
pdialog.setMessage("任务正在执行中,请耐心等待...");
pdialog.setCancelable(false);
pdialog.setMax(182);
pdialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pdialog.setIndeterminate(false);
pdialog.show();
} /**
* 重写该方法就是后台线程将要完成的任务,该方法可以调用
* publishProgress(Progress.. values)方法更新任务的执行进度。
*/
@Override
protected String doInBackground(URL... params) {
StringBuilder sb = new StringBuilder();
try {
URLConnection conn = params[0].openConnection();
BufferedReader br = new BufferedReader(
new InputStreamReader(conn.getInputStream(), "utf-8"));
String line = null;
while((line = br.readLine()) != null){
sb.append(line + "\n");
hasRead++;
publishProgress(hasRead);
}
return sb.toString();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
}
} /**
* 当doInBackground完成后,系统自动调用
*/
@Override
protected void onPostExecute(String result) {
//show.setText(result);
webView.loadDataWithBaseURL(null, result, "text/html", "utf-8", null);
pdialog.dismiss();
} @Override
protected void onProgressUpdate(Integer... values) {
show.setText("已经读取了【" + values[0] + "】行!");
pdialog.setProgress(values[0]);
} }
}

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:gravity="center_horizontal"> <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="102dp"
android:text="TextView" />
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="31dp"
android:text="开始下载"
android:onClick="download"/> <WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>

运行结果:

             

Android菜鸟的成长笔记(13)——异步任务(Async Task)的更多相关文章

  1. Android菜鸟的成长笔记(3)——给QQ登录界面说So Easy

    原文:Android菜鸟的成长笔记(3)--给QQ登录界面说So Easy 上一篇:Android菜鸟的成长笔记(2)--第一个Android应用 我们前面已经做了第一个Android应用程序,虽然有 ...

  2. Android菜鸟的成长笔记(2)——第一个Android应用

    原文:Android菜鸟的成长笔记(2)--第一个Android应用 上一篇:Android菜鸟的成长笔记(1)--Anddroid环境搭建从入门到精通 在上一篇Android菜鸟的成长笔记(1)中我 ...

  3. Android菜鸟的成长笔记(1)——Android开发环境搭建从入门到精通

    原文:Android菜鸟的成长笔记(1)--Android开发环境搭建从入门到精通 今天在博客中看到好多Android的初学者对Android的开发环境的搭建不熟悉而导致不能进行学习,所以我决定自己写 ...

  4. Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上)

    原文:[置顶] Android菜鸟的成长笔记(14)—— Android中的状态保存探究(上) 我们在用手机的时候可能会发现,即使应用被放到后台再返回到前台数据依然保留(比如说我们正在玩游戏,突然电话 ...

  5. Android菜鸟的成长笔记(12)——Handler、Loop、MessageQueue

    原文:[置顶] Android菜鸟的成长笔记(12)——Handler.Loop.MessageQueue 当一个程序第一次启动时,Android会启动一条主线程(Main Thread),主线程主要 ...

  6. Android菜鸟的成长笔记(11)——Android中的事件处理

    原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的 ...

  7. Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值

    原文:[置顶] Android菜鸟的成长笔记(10)——使用Bundle在Activity之间传值 前面我们了解了如何启动一个Activity,一个Activity在启动另外一个Activity的时候 ...

  8. Android菜鸟的成长笔记(9)——Intent与Intent Filter(下)

    原文:[置顶] Android菜鸟的成长笔记(9)——Intent与Intent Filter(下) 接着上一篇的内容,下面我们再来看看Intent的Data与Type属性. 一.Data属性与Typ ...

  9. Android菜鸟的成长笔记(8)——Intent与Intent Filter(上)

    原文:[置顶] Android菜鸟的成长笔记(8)——Intent与Intent Filter(上) Intent代表了Android应用的启动“意图”,Android应用将会根据Intent来启动指 ...

随机推荐

  1. Debian为程序添加一个开始菜单,debian添加sublime开始菜单.

    下了一个 '绿色' 的程序,想要加到开始菜单里面. 怎么做呢? 我这里以sublime2做例 去http://www.sublimetext.com/2 下载了linux 64位, 解压放到了下面的文 ...

  2. UNIX环境高级编程——网络基础概念

    TCP协议分成两个不同的协议: 1.网络传输中差错的传输控制协议TCP 2.专门负责对不同网络进行互联的互联网协议IP 网络体系结构概念: 网络体系结构即是指网络的层次结构和每层所使用协议的集合 OS ...

  3. 数论F - Strange Way to Express Integers(不互素的的中国剩余定理)

    F - Strange Way to Express Integers Time Limit:1000MS     Memory Limit:131072KB     64bit IO Format: ...

  4. net异步编程之await

    net异步编程之await 初探asp.net异步编程之await   终于毕业了,也顺利进入一家期望的旅游互联网公司.27号入职.放肆了一个多月没写代码,好方啊. 另外一下观点均主要针对于await ...

  5. 浙江大学PAT上机题解析之3-05. 求链式线性表的倒数第K项

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式说明: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出 ...

  6. 【剑指offer】字符串转整数

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/28015693 题目描写叙述: 将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函 ...

  7. ASP.NET 4.5 Bundle组件(捆绑、缩小静态文件)

    阅读目录: 1.开篇介绍 2.System.Web.Optimization 组件 3.System.Web.Optimization 组件基本原理 4.扩展自定义类型静态文件 1]开篇介绍 这篇文章 ...

  8. android设置eclipse中的自动提示功能

    菜单window->Preferences->Java->Editor->Content Assist->Enable auto activation 选项要打上勾 (并 ...

  9. [Boost基础]并发编程——asio网络库——异步socket处理

    异步服务器端 #include <conio.h> #include <iostream> using namespace std; #include <boost/as ...

  10. HDU3572_Task Schedule(网络流最大流)

    解题报告 题意: 工厂有m台机器,须要做n个任务.对于一个任务i.你须要花费一个机器Pi天,并且,開始做这个任务的时间要>=Si,完毕这个任务的时间<=Ei. 对于一个任务,仅仅能由一个机 ...