AsyncTask

       Android提供的一个轻量级的异步操作类,可以直接继承AsyncTask,在类中直接实现异步操作,并使用接口反馈当前异步操作的执行进度(即可以通过接口线程的进度更新,或者是将
执行的结果反馈给UI主线程)。
1.布局文件(使用Scroll可以使TextView在超出限定范围时滚动)
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3 xmlns:tools="http://schemas.android.com/tools"
 4 android:layout_width="match_parent"
 5 android:layout_height="match_parent"
 6 android:orientation="vertical"
 7 tools:context="com.example.administrator.async.MainActivity">
 8 
 9     <Button
10 android:layout_width="wrap_content"
11 android:layout_height="wrap_content"
12 android:text="New Button"
13 android:id="@+id/button" />
14 
15     <ScrollView
16 android:layout_width="match_parent"
17 android:layout_height="wrap_content">
18         <TextView
19 android:id="@+id/tv"
20 android:layout_width="wrap_content"
21 android:layout_height="wrap_content"
22 android:text="Hello World!" />
23     </ScrollView>
24 
25 </LinearLayout>

2.AndroidMainfest中设置(添加网络连接权限)

<uses-permission android:name="android.permission.INTERNET"/>

3.class

  1 package com.example.administrator.async;
  2 
  3 import android.os.AsyncTask;
  4 import android.os.Bundle;
  5 import android.support.v7.app.ActionBarActivity;
  6 import android.view.Menu;
  7 import android.view.MenuItem;
  8 import android.view.View;
  9 import android.widget.TextView;
 10 import android.widget.Toast;
 11 
 12 import com.example.administrator.async.R;
 13 
 14 import java.io.BufferedReader;
 15 import java.io.IOException;
 16 import java.io.InputStream;
 17 import java.io.InputStreamReader;
 18 import java.net.MalformedURLException;
 19 import java.net.URL;
 20 import java.net.URLConnection;
 21 
 22 public class MainActivity extends ActionBarActivity {
 23 
 24     TextView tv;
 25 @Override
 26 protected void onCreate(Bundle savedInstanceState) {
 27 super.onCreate(savedInstanceState);
 28 setContentView(R.layout.activity_main);
 29 tv = (TextView) findViewById(R.id.tv);
 30 tv.setOnClickListener(new View.OnClickListener() {
 31 @Override
 32 public void onClick(View v) {
 33                 ReadUrl("http://www.baidu.com");
 34 }
 35         });
 36 }
 37 
 38 public void ReadUrl(String url){
 39 
 40 new AsyncTask<String, Float, String>() {
 41 //<初始化时传入数据的数据类型,处理过程中返回值数据的数据类型,返回结果的数据类型>
 42             //获取返回值后AsyncTask会自动执行回调方法
 43 @Override
 44 //实现一个读取网络数据的功能
 45 protected String doInBackground(String... params) {
 46 //传入的是一个String类型的数组,也就是上面传入的第一个参数类型
 47 //该方法与线程中的run方法很相似,也就是执行后台的操作
 48 //在doInBackGround里只能执行不涉及UI的操作,也就是说涉及UI线程的操作或则说
 49 //和UI主线程的互动只能在下面的回调方法里进行
 50 try {
 51                     URL url = new URL(params[0]);
 52 URLConnection connection = url.openConnection();
 53                     long total = connection.getContentLength();
 54 InputStream ipt = connection.getInputStream();
 55 InputStreamReader reader = new InputStreamReader(ipt);
 56 BufferedReader br = new BufferedReader(reader);
 57 //上述为包装过程
 58 String line;//用来读取一行信息
 59 StringBuilder builder = new StringBuilder();//用来存放和连接读取的所有数据
 60 while((line = br.readLine())!=null){
 61                         builder.append(line);
 62 publishProgress((float)builder.toString().length()/total);
 63 }
 64 //然后要将打开的流依次关闭
 65 br.close();
 66 ipt.close();
 67                     return  builder.toString();//将读取到的数据转化为String类型并返回
 68 } catch (MalformedURLException e) {
 69                     e.printStackTrace();
 70 } catch (IOException e) {
 71                     e.printStackTrace();
 72 }
 73 return null;
 74 }
 75 
 76 @Override
 77 //在当前的AsyncTask执行之前会执行该方法
 78 protected void onPreExecute() {
 79                 Toast.makeText(MainActivity.this, "开始读取", Toast.LENGTH_SHORT).show();
 80                 super.onPreExecute();
 81 }
 82 
 83 @Override
 84 //当前的AsyncTask结束后会自动调用该方法,传入的参数实际上就是doInBackGround的返回值
 85 protected void onPostExecute(String s) {
 86 super.onPostExecute(s);
 87 tv.setText(s);
 88 }
 89 
 90 @Override
 91 //在当前的AsyncTask执行过程中会执行
 92 protected void onProgressUpdate(Float... values) {
 93                 System.out.println(values);
 94                 super.onProgressUpdate(values);
 95 }
 96 @Override
 97 protected void onCancelled(String s) {
 98 super.onCancelled(s);
 99 }
100 
101 @Override
102 protected void onCancelled() {
103 super.onCancelled();
104 }
105         }.execute(url);//启动,把参数传入,则doInBackGround中传入String数组中的第一个就是传入的参数
106 }
107 }

 

posted @ 2016-04-23 15:35  阙建明  阅读(170)  评论(0编辑  收藏  举报