您的位置:首页 > 其它

AsyncTask(异步操作)

2016-07-30 10:57 369 查看
翻阅官方文档,把重要的内容截取下来。









引用大神的讲解:

http://www.cnblogs.com/dawei/archive/2011/04/18/2019903.html

这里做了一个例子是下载网络上的图片:

先看一下在手机上模拟的效果:



activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.downloadimage.MainActivity" >

<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerInParent="true"
android:src="@drawable/ic_launcher" />

<Button
android:id="@+id/btn_download"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="#7CB342"
android:text="下载"
android:onClick="downLoadImage"
android:textColor="#fff"
android:textSize="20sp" />

</RelativeLayout>


MainActivity.java

package com.example.downloadimage;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;

public class MainActivity extends Activity {

private ImageView iv;
private String PATH = "https://pixabay.com/static/uploads/photo/2015/10/16/01/09/ad-990314_960_720.jpg";// 图片的地址

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.imageView1);

}

// 按钮的点击事件
public void downLoadImage(View v) {
new MyAsyncTask().execute(PATH);// 将图片的地址放在这里,等会可以在异步任务里进行转换成图片
}

/*
* 自定义MyAsyncTask,并重写AsyncTask其中的三个参数 第一个是params:执行下载操作时候传入的参数,一般是图片的地址。
* 第二个Progerss:显示进度的类型。 第三个Result:执行完下载后返回的结果
*/

class MyAsyncTask extends AsyncTask<String, Integer, byte[]> {
private ProgressDialog dialog;

// 在doInBackground中执行耗时任务
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(MainActivity.this);
dialog.setTitle("下载进度");
dialog.setMessage("Loading.......");
dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
dialog.show();
}

@Override
protected byte[] doInBackground(String... params) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
HttpURLConnection conn;
URL url = null;
int responseCode = 0;
try {
url = new URL(params[0]);
conn = (HttpURLConnection) url.openConnection();// 打开网络

conn.setDoInput(true);
conn.setRequestMethod("GET"); // 获取方式为Get请求
conn.connect();// 打开连接
responseCode = conn.getResponseCode(); // 获取响应码

// 如果响应码为200,说明相应成功
if (responseCode == 200) {
long totalLength = conn.getContentLength();// 获取下载图片的总长度
int current = 0;// 获取当前下载图片的文件的长度
InputStream inputStream = null;// 获取流对象
inputStream = conn.getInputStream();
byte[] data = new byte[1024];// 获取流对象之后,创建一个字节数组
int temp = 0;
while ((temp = inputStream.read(data)) != -1) {
current += temp;// 将每次循环读取的内容添加到当前的变量中
int progress = (int) ((current / (float) totalLength) * 100);// 根据文件的总长度和当前进度获取图片的下载进度
publishProgress(progress);// 执行该方法 将进度发布到主线程中
stream.write(data, 0, temp);
stream.flush();
}
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return stream.toByteArray();// 将字节数组进行返回
}

@Override
protected void onPostExecute(byte[] result) {
if (result != null && result.length != 0) {// 说明执行成功
// 将刚刚的字节流转换成图片对象
Bitmap bitmap = BitmapFactory.decodeByteArray(result, 0,
result.length);
iv.setImageBitmap(bitmap);
} else {
Toast.makeText(MainActivity.this, "图片下载失败", Toast.LENGTH_SHORT)
.show();// 说明图片下载失败
}
dialog.dismiss();// 将对话框消失,否则会一直出现
}

// 表示运行在主线程中更新进度的方法,如果在doInBackground方法中调用publishProgress方法向主线程中发布进度,由该方法获取进度之后更新ui
@Override
protected void onProgressUpdate(Integer... values) {
//  Log.i("tag", Thread.currentThread().getName());// 由这个方法我们可以知道onProgressUpdate是运行在主线程中的
dialog.setProgress(values[0]);// 设置进度
}

}
}


最后很重要的是要设置网络权限

<uses-permission android:name="android.permission.INTERNET" />
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: