当一个程序第一次启动时,Android会同时启动一个对应的主线程,这个主线程称为UI线程,
该线程主要负责处理与UI相关的事件,从网络上接受数据的时候,一般都要再开启一个线程来完成,
但子线程有不能更新控件,让网络上的数据显示在控件上;Android提供了有几种方法,其中使用
频率较高的是Handler机制,但这个代码有时也很复杂很难理解。
Android1.5之后提供了一个工具类AsnycTask:
AsyncTask是抽象类.AsyncTask定义了三种泛型类型 Params,Progress和Result。
Params 启动任务执行的输入参数,比如HTTP请求的URL;
Progress 后台任务执行的百分比;
Result 后台执行任务最终返回的结果,比如String;
1) 子类化AsyncTask
2) 实现AsyncTask中定义的下面一个或几个方法
onPreExecute(), 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。
doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台计算工作。可以调用publishProgress方法来更新实时的任 务进度。该方法是抽象方法,子类必须实现。
onProgressUpdate(Progress...),在publishProgress方法被调用后,UI thread将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用,后台的计算结果将通过该方法传递到UI thread。
例子:
public class LuanQiBaZaoActivity extends Activity {
private Button button;
private TextView progress;
private TextView kk;
private ProgressBar bar;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button = (Button) findViewById(R.id.download);
kk = (TextView) findViewById(R.id.kk);
progress = (TextView) findViewById(R.id.progress);
bar = (ProgressBar) findViewById(R.id.progressBar1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
new downloadPro().execute(100);
}
});
}
class downloadPro extends AsyncTask<Integer, Integer, String> {
@Override
protected void onPostExecute(String result) { //当doInBackground执行完的时候,这个方法会被调用,result是doInBackground返回的数据
kk.setText(result);
super.onPostExecute(result);
}
@Override
protected void onPreExecute() { //第一次被调用,可用来初始化控件
bar.setVisibility(View.VISIBLE);
super.onPreExecute();
}
@Override
protected void onProgressUpdate(Integer... values) {
progress.setText(values[0] + "%");
super.onProgressUpdate(values);
}
@Override
protected String doInBackground(Integer... arg0) { //后台调用,可用来执行消耗时间较长的,如下载
for(int i=0; i<100; i++) {
bar.setProgress(i);
publishProgress(i); //一旦这个方法被调用,onProgressUpdate这个方法会被调用
try {
Thread.sleep(arg0[0]);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "执行完毕";
}
}
}

浙公网安备 33010602011771号