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)

                    /**

Activity.runOnUiThread(new Runnable()    
        {    
            public void run()    
            {    
                Toast.makeText(getApplicationContext(), , "Update My UI",    
                        Toast.LENGTH_LONG).show();    
            }    
    
        }); 
**/

                   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();
}
}


}

**/



原创粉丝点击