您的位置:首页 > 移动开发 > Android开发

Android(异步任务) AsyncTask

2015-09-20 15:41 513 查看

AsyncTask知识复习

异步加载原因

A、Android单线程模型

B、耗时操作阻塞UI线程

异步加载常见方式

A、多线程\线程池

B、AsyncTask

AsyncTask类解释

class A extends AsyncTask<Params, Progress, Result>


Params 任务开始输入的数据类型,一般为String(URL)地址哦。

Progress任务执行进度的类型哦,一般可以是Integer

Result任务执行后返回的数据类型,一般不知道,看自己定义的。

AsyncTask需要重写的方法



5.



package com.example.asynctask_download;

import java.io.IOException;

import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.DefaultClientConnection;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
private String url = "http://h.hiphotos.baidu.com/image/pic/item/2e2eb9389b504fc2022d2904e7dde71190ef6d45.jpg";
private Button bt;
private ImageView iView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.bt);
iView = (ImageView) findViewById(R.id.imageView1);
bt.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
//
HttpClient httpClient = (HttpClient) new DefaultHttpClient();
HttpGet httpGet = new HttpGet(url);
try {
httpClient.execute(httpGet);
} catch (ClientProtocolException e) {
//
e.printStackTrace();
} catch (IOException e) {
//
e.printStackTrace();
}
}
});

}

}


当我们之间记载图片是会报出这样的错误,Android3.0后不能在UI线程中执行网络操作,否则报一下错误



> 这里是带进度条的异步图片加载方法

package com.example.asynctask_download;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.impl.conn.DefaultClientConnection;
import org.apache.http.util.EntityUtils;

import android.R.integer;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Entity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;

public class MainActivity extends Activity {
private String url = "http://h.hiphotos.baidu.com/image/pic/item/2e2eb9389b504fc2022d2904e7dde71190ef6d45.jpg";
private Button bt;

/**
* 变量或对象的描述
*
* @Fields iView : 相框
* @type
*/
private ImageView iView;

/**
* 变量或对象的描述
*
* @Fields bitmap : 图片
* @type
*/
private Bitmap bitmap;

/**
* 变量或对象的描述
*
* @Fields progressDialog : 进度条
* @type
*/
private ProgressDialog progressDialog;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.bt);
iView = (ImageView) findViewById(R.id.imageView1);
progressDialog = new ProgressDialog(this);
progressDialog.setTitle("提示信息");
progressDialog.setMessage("正在执行,请稍等");
progressDialog.setProgressStyle(progressDialog.STYLE_HORIZONTAL);
progressDialog.setCancelable(false);
bt.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {
// 执行异步任务的操作
new MyAsyncTask().execute(url);

}

});

}

class MyAsyncTask extends AsyncTask<String, Integer, Bitmap> {

/**
* @Title:【重写】 doInBackground
* @Description:耗时操作执行类
* @param params
* @return
*/
@Override
protected Bitmap doInBackground(String... params) {
Bitmap bitmap = null;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();// 创建一个输出流
InputStream inputStream_nadao = null;// 创建一个输入流用于拿到数据
// 使用网络链接类HttpClient类完成对网络数据的提取
HttpClient httpClient = (HttpClient) new DefaultHttpClient();
// 获取链接方式
HttpGet httpGet = new HttpGet(params[0]);
try {
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode() == 200) {
inputStream_nadao = httpResponse.getEntity().getContent();

// 获取文件的一个总长度
long file_length = httpResponse.getEntity()
.getContentLength();
// 起始长度
int len = 0;
byte[] data = new byte[1024];
// 总长度
int total_length = 0;
while ((len = inputStream_nadao.read(data)) != -1) {
total_length += len;
int values = (int) (((total_length / (float) len) * 100));
publishProgress(values);
// 将图片放到outputStream中,他可以转换成字节数组
outputStream.write(data, 0, len);
}
// 创建一个字节数组
byte[] result = outputStream.toByteArray();
bitmap = BitmapFactory.decodeByteArray(result, 0,
result.length);

}
} catch (ClientProtocolException e) {
//
e.printStackTrace();
} catch (IOException e) {
//
e.printStackTrace();
} finally {
if (inputStream_nadao != null) {
try {
inputStream_nadao.close();
} catch (IOException e) {
//
e.printStackTrace();
}

}
}

return bitmap;

}

/**
* @Title:【重写】 onPreExecute
* @Description: 表示任务执行前的操作
*/
@Override
protected void onPreExecute() {
//
super.onPreExecute();
progressDialog.show();

}

/**
* @Title:【重写】 onProgressUpdate
* @Description:这里是执行进度的方法
* @param values
*/
@Override
protected void onProgressUpdate(Integer... values) {
//
super.onProgressUpdate(values);
progressDialog.setProgress(values[0]);

}

/**
* @Title:【重写】 onPostExecute
* @Description:负责更新UI
* @param result
*/
@Override
protected void onPostExecute(Bitmap result) {
//

super.onPostExecute(result);
iView.setImageBitmap(result);
progressDialog.dismiss();

}

}

}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: