AsyncTask探究
AsyncTask为用户提供了一个异步耗时处理的框架,在耗时操作开始前,完成操作结束后,执行耗时操作以及耗时操作执行进度更新都有相应的回调方法,用户需要的做的就是实现方法体
写个Demo试一下,Demo的功能是点击开始,进度条显示出来,并且每隔1s前进一个格,完成之后进度条消失
package com.bj.jack.asynctaskdemo;
import java.security.PublicKey;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.content.res.Configuration;
import android.view.Menu;
import android.view.View;
import android.widget.ProgressBar;
public class MainActivity extends Activity {
private ProgressBar indictor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
indictor = (ProgressBar) findViewById(R.id.indictor);
indictor.setMax(10);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void onFirstButtonClick(View v){
//new CustomAsyncTask().execute("http://www.baidu.com/img/logo.gif","xiaoer");
new CustomAsyncTask2().execute(0);
}
private class CustomAsyncTask extends AsyncTask<String,String,String>{//执行传递的值类型,更新传递的值类型,执行完成返回的值类型
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... arg0) {//arg0为AsycnTask execute方法传递过来的参数
//调用publishProgress,在onProgressUpdate中更新进度
publishProgress("update 1","update 2");
return "finished flag";
}
@Override
protected void onPostExecute(String result) {//result的值为doInBackground的返回值 “finished flag”
super.onPostExecute(result);
}
@Override
protected void onProgressUpdate(String... values) {//values 为 publishProgress("update 1","update 2")方法传递过来的 update1 ,update2
super.onProgressUpdate(values);
}
}
private class CustomAsyncTask2 extends AsyncTask<Integer,Integer,Long>{
@Override
protected Long doInBackground(Integer... arg0) {
// TODO Auto-generated method stub
int count = 0;
while(true){
if(count++>10){
break;
}
try {
Thread.sleep(1000);
publishProgress(count);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
indictor.setVisibility(View.VISIBLE);
indictor.setProgress(0);
}
@Override
protected void onPostExecute(Long result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
indictor.setVisibility(View.INVISIBLE);
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
indictor.setProgress(values[0]);
}
}
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
System.out.println("______configuration change");
}
}
容易混淆的地方
private class CustomAsyncTask2 extends AsyncTask
需要注意的地方
- AsycnTask Extecute必须在主线程中执行
- 除了doInBackground方法不能操作主线程里的UI,其他的方法里都可以修改,因为doInBackground非主线程