zoukankan      html  css  js  c++  java
  • android 开发-AsyncTask异步任务的实现

    •  AsyncTask实现的原理,和适用的优缺点

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

      以下部分是学习代码:

        UI:

     1 <RelativeLayout 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:paddingBottom="@dimen/activity_vertical_margin"
     6     android:paddingLeft="@dimen/activity_horizontal_margin"
     7     android:paddingRight="@dimen/activity_horizontal_margin"
     8     android:paddingTop="@dimen/activity_vertical_margin"
     9     tools:context=".MainActivity" >
    10 
    11     <ImageView
    12         android:id="@+id/imageView1"
    13         android:layout_width="wrap_content"
    14         android:layout_height="wrap_content"
    15         android:maxWidth="750dp"
    16         android:maxHeight="400dp"
    17         android:adjustViewBounds="true"
    18          />
    19 
    20     <Button
    21         android:id="@+id/button1"
    22         android:layout_width="wrap_content"
    23         android:layout_height="wrap_content"
    24         android:layout_alignParentBottom="true"
    25         android:layout_centerHorizontal="true"
    26         android:layout_marginBottom="68dp"
    27         android:text="下载网络图片" />
    28 
    29 
    30 </RelativeLayout>

        Activity:

        

      1 package com.example.android_asynctask_downloadimage;
      2 
      3 import java.io.ByteArrayOutputStream;
      4 import java.io.IOException;
      5 import java.io.InputStream;
      6 
      7 import org.apache.http.HttpResponse;
      8 import org.apache.http.client.HttpClient;
      9 import org.apache.http.client.methods.HttpGet;
     10 import org.apache.http.impl.client.DefaultHttpClient;
     11 
     12 import android.app.Activity;
     13 import android.app.ProgressDialog;
     14 import android.graphics.Bitmap;
     15 import android.graphics.BitmapFactory;
     16 import android.os.AsyncTask;
     17 import android.os.Bundle;
     18 import android.view.Menu;
     19 import android.view.View;
     20 import android.widget.Button;
     21 import android.widget.ImageView;
     22 
     23 /**
     24  * @author xiaowu
     25  * NOTE:异步任务AsyncTask
     26  */
     27 public class MainActivity extends Activity {
     28     private Button button ;
     29     private Button button2 ;
     30     private ImageView imageView ;
     31     private final String IMAGE_PATH ="http://e.hiphotos.baidu.com/zhidao/pic/item/c2fdfc039245d68858f1c69fa5c27d1ed21b241d.jpg";
     32     private ProgressDialog progressDialog ;
     33     @Override
     34     protected void onCreate(Bundle savedInstanceState) {
     35         super.onCreate(savedInstanceState);
     36         setContentView(R.layout.activity_main);
     37         button = (Button) this.findViewById(R.id.button1);
     38         progressDialog = new ProgressDialog(MainActivity.this);
     39         progressDialog.setTitle("提示");
     40 //        progressDialog.setCancelable(false);
     41         progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
     42         progressDialog.setMessage("正在下载图片,请耐心等待...");
     43         
     44         imageView = (ImageView) this.findViewById(R.id.imageView1);
     45         button.setOnClickListener(new View.OnClickListener() {
     46             @Override
     47             public void onClick(View v) {
     48                 // TODO Auto-generated method stub
     49                 new MyTask().execute(IMAGE_PATH);
     50             }
     51         });
     52         
     53     }
     54     /**
     55      * @author xiaowu
     56      * 异步任务AsyncTask,执行网络下载图片
     57      * AsyncTask<String,  Integer, byte[]>    如果异步任务不需要参数传递,可以直接将参数设置为Void
     58      *      params:    
     59      *         String:(网络图片的)路径    
     60      *         Integer: 进度单位,刻度类型
     61      *         byte[]:异步任务执行的返回结果
     62      * 异步任务有4个步骤:
     63      *         1、onPreExecute();    在异步任务执行之前执行,用来构建一个异步任务,如显示一个进度条给用户看
     64      *          2、doInBackground(Params...);    异步任务必须实现的方法,具体的异步任务所做的事情
     65      *        3、onProgressUpdate(Progress...);
     66      *      4、onPostExecute(Result);
     67      */
     68     public class MyTask extends AsyncTask<String,  Integer, byte[]>{
     69         //在异步任务执行之前执行,用来构建一个异步任务,如显示一个进度条给用户看
     70         @Override
     71         protected void onPreExecute() {
     72             // TODO Auto-generated method stub
     73             super.onPreExecute();
     74             //展示进度条对话框
     75             progressDialog.show();
     76         }
     77         //异步任务必须实现的方法,具体的异步任务所做的事情。并将结果返回值最后一个步骤。
     78         @Override
     79         protected byte[] doInBackground(String... params) {
     80             // TODO Auto-generated method stub
     81             //
     82             HttpClient httpClient = new DefaultHttpClient();
     83             HttpGet httpGet = new HttpGet(params[0]);
     84             InputStream inputStream = null; 
     85             byte[] result = null;    //图片的所有内容
     86             ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
     87             try {
     88                 //发起get请求,并获取反馈
     89                 HttpResponse httpResponse = httpClient.execute(httpGet);
     90                 long file_length = httpResponse.getEntity().getContentLength();    //文件实际总长度
     91                 int total_length = 0 ;
     92                 byte[] data = new byte[1024];
     93                 int len = 0 ;
     94                 if (httpResponse.getStatusLine().getStatusCode()==200) {
     95 //                    result = EntityUtils.toByteArray(httpResponse.getEntity());
     96                     //读取返回内容(内容是以流的形式返回)
     97                     inputStream = httpResponse.getEntity().getContent();
     98                     //更新进度条并读取数据
     99                     while ((len = inputStream.read(data)) != -1) {
    100                         total_length +=len ;
    101                         int progress_value = (int) ((total_length/ (float) file_length)*100);
    102                         //通过publishProgress()方法发布进度值到onProgressUpdate
    103                         publishProgress(progress_value);    //发布刻度单位
    104                         byteArrayOutputStream.write(data, 0, len);
    105                     }
    106                 }
    107                 result = byteArrayOutputStream.toByteArray();
    108             }catch (IOException e) {
    109                 // TODO Auto-generated catch block
    110                 e.printStackTrace();
    111             }finally{
    112                 //关连接
    113                 httpClient.getConnectionManager().shutdown();
    114             }
    115             
    116             return result;
    117         }
    118         //更新UI展示信息:如进度条的变动
    119         @Override
    120         protected void onProgressUpdate(Integer... values) {
    121             // TODO Auto-generated method stub
    122             super.onProgressUpdate(values);
    123             progressDialog.setProgress(values[0]);
    124         }
    125         //将doInBackground的执行结果展示到UI
    126         @Override
    127         protected void onPostExecute(byte[] result) {
    128             // TODO Auto-generated method stub
    129             super.onPostExecute(result);
    130             Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0, result.length);
    131             imageView.setImageBitmap(bitmap);
    132             progressDialog.dismiss();
    133         }
    134         
    135     }
    136     @Override
    137     public boolean onCreateOptionsMenu(Menu menu) {
    138         // Inflate the menu; this adds items to the action bar if it is present.
    139         getMenuInflater().inflate(R.menu.main, menu);
    140         return true;
    141     }
    142 
    143 }
  • 相关阅读:
    计算机综合面试题总结
    MySQL入门很简单: 13 数据备份和还原
    MySQL入门很简单: 12 MYSQL 用户管理
    MySQL入门很简单: 11 mysql函数
    页面即使加过了移除监听事件,但是到新页面后事件任然存在
    git命令大全
    document.documentElement.scrollTop指定位置失效解决办法
    vue做商品选择如何保持样式
    vue父组件向子组件传对象,不实时更新解决
    vue 遮罩层阻止默认滚动事件
  • 原文地址:https://www.cnblogs.com/HEWU10/p/4349646.html
Copyright © 2011-2022 走看看