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 }