AsyncTask:【a/thik/task】
主要作用:
1.子线程中更新UI
2.封装,简化异步(耗时)操作。
AsyncTask<Params,Progress,Result>是一个抽象类,使用时要继承它。
1. Params:启动任务时输入参数的类型。
2. Progress:onProgressUpdate()执行完成后返回结果类型。
3. Result:doInBackground()执行完成后返回结果的类型
常用方法-执行顺序
1. onPreExcute:启动异步任务时原线程的初始化操作。
2. doInBackground:必须重写的方法,异步执行后台线程的操作。
3. onProgressUpdate:在doInBackground()中用执行publishProgress()语句调用此方法。
4. onPostExcute():将doInBackgroubd()的返回值传给该方法并调用。
5. 创建对象,通过m_asy.execute(Params)启动异步任务。其参数传给doInBackground()中。
public class MainActivity extends Activity {
Button btn;
ProgressBar m_progressbar;
ImageView m_imageview;
/* 项目需要网络链接,不要忘记在Androidmanifest文件中添加权限
<uses-permission android:name="android.permission.INTERNET"/>*/
String url="http://img3.doubanio.com/view/photo/photo/public/p2103400229.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn=(Button) findViewById(R.id.button1);
m_imageview=(ImageView) findViewById(R.id.imageView1);
m_progressbar=(ProgressBar) findViewById(R.id.progressBar1);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
MyAsyncTask m_asy= new MyAsyncTask();
m_asy.execute(url);
}
});
}
class MyAsyncTask extends AsyncTask<String,Void,Bitmap>{
@Override
protected Bitmap doInBackground(String... arg0) {
// TODO Auto-generated method stub
String url = arg0[0];
Bitmap bitmap=null;
URLConnection connection;
InputStream is;
try {
connection = new URL(url).openConnection();
is = connection.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is);
Thread.sleep(3000);
bitmap = BitmapFactory.decodeStream(bis);
is.close();
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return bitmap;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
// TODO Auto-generated method stub
super.onPostExecute(bitmap);
m_imageview.setImageBitmap(bitmap);
m_progressbar.setVisibility(View.GONE);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
m_progressbar.setVisibility(View.VISIBLE);
}
}
}
取消AsyncTask
AsyncTask中执行按照线程池中的顺序,所以当前异步处理未完成前不会执行下一个任务。而在Java中无法粗暴的终结一个线程。
但可在特定的方法中给线程添加cancel标记,并在doInBackground和onProgressUpdate根据if语句判断m_asy的状态,如果为标记状态,则结束当前执行的操作(并不是终结这个线程,而是执行完了这个线程)。
//在onPause()等方法中,给m_asy添加标记。
if(m_asy != null &&//不为空且RUNNING中
m_asy.getStatus()= AsyncTask.Status.RUNNING){
m_asy.cancel(true);
//在doInBackground,判断m_asy的状态
if(iscancel()){
break;
}
//在onProgressUpdate()中,判断m_asy的状态
if(iscancel()){
return;
}