菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
175
0

Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)

原创
05/13 14:22
阅读数 84385

     AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程.

1.  Android异步任务处理(AsyncTask使用):

(1)工程一览图:

 

 

(2) 首先设计布局文件activity_main.xml,如下:

 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:orientation="vertical"
 6     tools:context="com.himi.asynctask.MainActivity" >
 7     
 8      <Button
 9         android:id="@+id/read"
10         android:layout_width="wrap_content"
11         android:layout_height="wrap_content"
12         android:text="Button" />
13     
14 
15     <ScrollView
16         android:layout_width="fill_parent"
17         android:layout_height="wrap_content">
18         <TextView
19             android:id="@+id/textView1"
20             android:layout_width="wrap_content"
21             android:layout_height="wrap_content"
22             android:text="@string/hello_world" />
23     </ScrollView>
24 
25    
26 </LinearLayout>

布局文件效果,如下:

 

(3)MainActivity.java: 

  1 package com.himi.asynctask;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.IOException;
  5 import java.io.InputStream;
  6 import java.io.InputStreamReader;
  7 import java.net.MalformedURLException;
  8 import java.net.URL;
  9 import java.net.URLConnection;
 10 
 11 import android.app.Activity;
 12 import android.os.AsyncTask;
 13 import android.os.Bundle;
 14 import android.view.View;
 15 import android.view.View.OnClickListener;
 16 import android.widget.TextView;
 17 import android.widget.Toast;
 18 
 19 public class MainActivity extends Activity {
 20     TextView text;
 21 
 22     @Override
 23     protected void onCreate(Bundle savedInstanceState) {
 24         super.onCreate(savedInstanceState);
 25         setContentView(R.layout.activity_main);
 26         text = (TextView) findViewById(R.id.textView1);
 27         findViewById(R.id.read).setOnClickListener(new OnClickListener() {
 28             
 29             public void onClick(View v) {
 30                 ReadURL("http://www.baidu.com");
 31                 
 32             }
 33         });;
 34     }
 35 
 36     
 37     public void  ReadURL(String url) {
 38         /**
 39          * AsyncTask的三个参数如下 40          *  Params 启动任务执行的输入参数,比如HTTP请求的URL。
 41          *  Progress 后台任务执行的百分比。
 42          *  Result 后台执行任务最终返回的结果,比如String。
 43          */
 44         new AsyncTask<String, Float, String>() {
 45             
 46             /**
 47              * doInBackground()方法用于在执行异步任务,不可以更改主线程中UI 
 48              */
 49             @Override
 50             protected String doInBackground(String... params) {
 51                 try {
 52                     URL url  = new URL(params[0]);
 53                     URLConnection connection = url.openConnection();
 54                     long total = connection.getContentLength();
 55                     
 56                     InputStream iStream = connection.getInputStream();
 57                     InputStreamReader isr = new InputStreamReader(iStream);
 58                     BufferedReader br = new BufferedReader(isr);
 59                     
 60                     String line;
 61                     StringBuilder builder = new StringBuilder();
 62                     while((line = br.readLine()) != null) {
 63                         builder.append(line);
 64                         publishProgress((float)builder.toString().length()/total);
 65                     }
 66                     
 67                     br.close();
 68                     iStream.close();
 69                     
 70                     return builder.toString();
 71                 } catch (MalformedURLException e) {
 72                     // TODO 自动生成的 catch 块
 73                     e.printStackTrace();
 74                 } catch (IOException e) {
 75                     // TODO 自动生成的 catch 块
 76                     e.printStackTrace();
 77                 }
 78                 return null;
 79             }
 80 
 81             /**
 82              * 执行任务之前调用的代码,一般用来在执行后台任务时候,对前台的提示标记
 83              */
 84             @Override
 85             protected void onPreExecute() {
 86                 Toast.makeText(MainActivity.this, "开始读取", Toast.LENGTH_LONG).show();
 87                 super.onPreExecute();
 88             }
 89 
 90             
 91            /**onPostExecute()方法用于异步任务执行完成后,在主线程中执行的操作
 92             **参数result是doInBackground()方法的返回值
 93             */
 94             @Override
 95             protected void onPostExecute(String result) {
 96                 text.setText(result);
 97                 super.onPostExecute(result);
 98             }
 99 
100             /**
101              * onProgressUpdate()方法用于更新异步执行中,在主线程中处理异步任务的执行信息 
102              * 主要是告诉用户任务执行的进度,和用户进行交互.  
103              * 这里的数组values对应于AsyncTask中的第2个参数
104              * 
105              */
106             @Override
107             protected void onProgressUpdate(Float... values) {
108                 System.err.println(values[0]);
109                 super.onProgressUpdate(values);
110             }
111 
112             /**
113              * onCancelled()方法用于异步任务被取消时,在主线程中执行相关的操作 
114              * 
115              */
116             @Override
117             protected void onCancelled(String result) {
118                 // TODO 自动生成的方法存根
119                 super.onCancelled(result);
120             }
121 
122             @Override
123             protected void onCancelled() {
124                 // TODO 自动生成的方法存根
125                 super.onCancelled();
126             }
127             
128         }.execute(url);
129     }
130     
131 }

(4)AndroidManifest.xml:

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 3     package="com.himi.asynctask"
 4     android:versionCode="1"
 5     android:versionName="1.0" >
 6 
 7     <uses-sdk
 8         android:minSdkVersion="15"
 9         android:targetSdkVersion="17" />
10     <uses-permission android:name="android.permission.INTERNET"/>
11 
12     <application
13         android:allowBackup="true"
14         android:icon="@drawable/ic_launcher"
15         android:label="@string/app_name"
16         android:theme="@style/AppTheme" >
17         <activity
18             android:name=".MainActivity"
19             android:label="@string/app_name" >
20             <intent-filter>
21                 <action android:name="android.intent.action.MAIN" />
22 
23                 <category android:name="android.intent.category.LAUNCHER" />
24             </intent-filter>
25         </activity>
26     </application>
27 
28 </manifest>

运行效果,如下:

 

 

发表评论

0/200
175 点赞
0 评论
收藏
为你推荐 换一批