转载自: http://blog.youkuaiyun.com/lanjianhun/article/details/8675299
android中实现子线程的方法有很多,首先就说说AsyncTask,这是android特意为更新UI设置的后台线程类,用起来十分方便,不过也有一些缺点,如果线程加载太多很容易出问题,详情可见AsyncTask的缺陷(http://www.oschina.net/question/54100_27825)。不过大部分时候用起来还是很不错的,因此对它先做一个总结。
最简单也最常用的就是后台更新加载数据或者其他耗时操作的进度条,我这里就以最简单的后台更新进度条为例进行一个示范,实现的功能就是点击按钮之后,初始化进度为0,然后子线程每秒钟将进度增加百分之十,直到百分之百。代码中有详细的注释,这里不做过多说明。
public class ThreadStudyActivity extends Activity {
/** Called when the activity is first created. */
private ProgressBar progressBar;
private Button button;
private int progress; //进度条进度
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
progressBar = (ProgressBar)findViewById(R.id.progressBar);
progressBar.setVisibility(View.INVISIBLE);//先隐藏进度条
button = (Button)findViewById(R.id.button1);
button.setOnClickListener(new Button.OnClickListener(){
@Override
public void onClick(View v){
new newTask().execute(); //启动子线程
}
});
}
/**
* 定义子线程类
* 继承于AsyncTask,其中<String, Integer, Boolean>代表的含义为:
* String:函数 doInBackground(String... params)的参数类型
* Integer:函数onProgressUpdate(Integer... values)的参数类型
* Boolean:函数doInBackground(String... params)的返回值,以及onPostExecute(Boolean result)的参数类型,两者要一致
* 如果没有必要,以上三个参数也可以都定义为void
* */
private class newTask extends AsyncTask<String, Integer, Boolean> {
//
@SuppressWarnings("unused")
/**
* 启动子线程前执行的函数,可以进行显示进度条,赋初值等操作
* */
protected void onPreExecute (){
progress = 0;
progressBar.setVisibility(View.VISIBLE); //显示进度条
progressBar.setProgress(progress);
Toast.makeText(ThreadStudyActivity.this, "子线程开始!", Toast.LENGTH_SHORT).show();
}
/**
* 子线程后台执行的程序,此处放置耗时操作
* 返回值同时作为onPostExecute(Boolean result)的参数
* */
protected Boolean doInBackground(String... params) {
for(int i=0;i<10;i++){
try {
Thread.sleep(1000);//延迟1秒钟
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
progress += 10;
publishProgress(progress); //通知onProgressUpdate(Integer... values)函数进行更新UI,其中progress作为参数
}
return true;
}
//在子线程执行过程中更新UI,此处为更新进度条
protected void onProgressUpdate(Integer... values) {
progressBar.setProgress(values[0]);
}
//子线程执行结束后,更新UI
protected void onPostExecute(Boolean result) {
if(result)
Toast.makeText(ThreadStudyActivity.this, "子线程正常结束!", Toast.LENGTH_SHORT).show();
progressBar.setVisibility(View.INVISIBLE);//隐藏进度条
}
}
}