AsyncTask的简单使用
来源:互联网 发布:miss外设淘宝店网址 编辑:程序博客网 时间:2024/05/22 05:04
android的UI操作并不是线程安全的:主线程中不能执行耗时操作、子线程中能操作主线程中的UI控件、UI操作只能在UI线程中执行。
获取线程的属性:long threadId = Thread.currentThread().getId();
String threadName = Thread.currentThread().getName();
主线程中睡眠一段时间:Thread.sleep(1000);/**1000时毫秒数**/
其他线程访问主线程的方法:
1、Handle线程通信机制
2、Activity.runOnUiThreadd(Runnable)
/**
3、AsyncTask(异步任务)
4、View.post(Runnable)或者View.postDelay(Runnable,long)
/**text.post(new Runnable() {
@Override
public void run() {
text.setText("任务已经完成");
}
});**/
为什么使用AsyncTask??
1、我们不需要自己创建子线程,AsyncTask内部已经封装好线程池去执行耗时操作。
2、不需要自己写相应的方法去更新UI界面。
3、AsyncTask已经包含了所有子线程和UI线程需要处理的操作。
4、它包含了一系列的回调方法来完成在子线程中去完成耗时操作并将结果返回给主线程去刷新UI。
使用AsyncTask的使用方法:
1、创建子类继承AsyncTask
2、复写AsyncTask的抽象方法,完成耗时操作并在主线程中刷新UI
3、调用AsyncTask。execute(String params)方法执行一部任务
/**
package com.danny_jiang.day08_downloadimage_progress;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
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.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity {
private static final String IMAGE_URL = "http://img1.ph.126.net/BmSbVg7ncmVYe4c_pdO77Q==/2622783833007290111.png";
private Button btn = null;
private ImageView image = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn_Main);
image = (ImageView) findViewById(R.id.image_Main);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new MyTask().execute(IMAGE_URL);
}
});
}
/**
* 继承AsyncTask是需要指定3个泛型
* 第一个泛型: 执行AsyncTask传入的参数类型execute(参数), 还是doInBackground得入参类型
* 第二个泛型: 想用户提示任务进度的使用的参数类型,可以使用Void说明不传任何类型
* 第三个泛型: doInBackground的返回值类型,onPostExecute的入参类型
*
*/
class MyTask extends AsyncTask<String, Integer, byte[]> {
private ProgressDialog pd;
/**
* 当调用AsyncTask.execute方法只后此方法立即被调用
* 在主线程中执行,做一些准备工作
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
pd = new ProgressDialog(MainActivity.this);
//设置对话框的样式
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// 设置对话框的标题
pd.setTitle("提示:");
// 设置对话框的内容
pd.setMessage("Downloading。。。");
// 显示对话框
pd.show();
}
/**
* 在子线程中执行耗时操作
* 入参是第一个泛型类型
* 返回值类型是第三个泛型类型
*/
@Override
protected byte[] doInBackground(String... params) {
String imageUrl = params[0];
// 声明读取网络请求的输入流,需要将此输入流写进byte数组中
InputStream is = null;
// 声明需要返回的byte数组
byte[] data = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
/*
* 一下步骤是真正的网路请求操作
*/
try {
URL url = new URL(imageUrl);
// 通过URL获取网络链接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if (conn != null && conn.getResponseCode() == 200) {
//声明数据的总长度
int totalLength = conn.getContentLength();
//默认读取0KB
int currentLength = 0;
// 获取网络请求的输入流
is = conn.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
baos.flush();
currentLength += len;
// progress / 100 = currentLength / totalLength;
int progress = (int) (currentLength / (float)totalLength * 100);
publishProgress(progress);
}
data = baos.toByteArray();
return data;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.close();
}
if (is != null) {
is.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
android.util.Log.e("danny", "onProgressUpdate " + values[0]);
pd.setProgress(values[0]);
}
/**
* 当doInBackground执行完之后立即执行
* 在主线程中执行
* 入参是doInBackground的返回值
*/
@Override
protected void onPostExecute(byte[] result) {
super.onPostExecute(result);
// 通过BitmapFactory将byte数组转化成Bitmap对象
Bitmap bm = BitmapFactory.decodeByteArray(result, 0, result.length);
// 调用setImageBitmap方法动态的设置ImageView的图片
image.setImageBitmap(bm);
// 将对话框隐藏
pd.dismiss();
}
}
}
**/
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- AsyncTask的简单使用
- 简单的AsyncTask使用例子
- Android AsyncTask 的简单使用
- Android中AsyncTask的简单使用
- Android 中的AsyncTask的简单使用心得
- Android AsyncTask+Soap 的简单使用
- AsyncTask的简单使用以及注意事项
- 编写一个程序,统计当前文件夹下每个文件类型的文件数
- Hadoop相关书籍
- POJ 3070:Fibonacci
- 使用java反编译查看java生成的exe文件的源码
- 《JAVA程序设计》第二版 黄岚 王岩 王康平编著 学习笔记与错误修正
- AsyncTask的简单使用
- 强\软\弱\虚引用
- Java保留两位小数的几种做法
- apache2手动删除etc目录后删除方法
- LPC23xx的自适应以太网通信接口设计
- C++数据存储区
- 带你秒懂STIL文件
- Windows下通过Anaconda安装TensorFlow及Spyder编译器
- ios 设备权限