zoukankan      html  css  js  c++  java
  • Java基础知识强化之网络编程笔记15:Android网络通信之 Android异步任务处理(AsyncTask使用)

         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>

    运行效果,如下:

  • 相关阅读:
    c/c++ 数组的智能指针 使用
    c/c++ 智能指针 weak_ptr 使用
    在ubuntu18.04上安装EOS
    c/c++ 智能指针 unique_ptr 使用
    python基础-内置装饰器classmethod和staticmethod
    java中5种异步转同步方法
    java自定义注解
    多线程之线程池(Thread,Runnable,callable,Future,FutureTask)
    java反射
    重写ThreadFactory方法和拒绝策略
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4889742.html
Copyright © 2011-2022 走看看