探寻Android的线程问题

2019-12-10 18:43:48于海丽

这个例子,我自己写完后觉得还是有点乱,要稍微整理才能看明白线程间交互的过程以及数据的前后变化。随后了解到AsyncTask类,相应修改后就很容易明白了!

2.3 AsyncTask

AsyncTask版:

((Button) findViewById(R.id.load_AsyncTask)).setOnClickListener(new View.OnClickListener(){ 
 
 @Override
 public void onClick(View view) { 
  data = null; 
  data = new ArrayList<string>(); 
 
  adapter = null; 
 
  //显示ProgressDialog放到AsyncTask.onPreExecute()里 
  //showDialog(PROGRESS_DIALOG); 
  new ProgressTask().execute(data); 
 } 
}); 
 
private class ProgressTask extends AsyncTask, Void, Integer> { 
 
/* 该方法将在执行实际的后台操作前被UI thread调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条。*/
@Override
protected void onPreExecute() { 
 // 先显示ProgressDialog
 showDialog(PROGRESS_DIALOG); 
} 
 
/* 执行那些很耗时的后台计算工作。可以调用publishProgress方法来更新实时的任务进度。 */
@Override
protected Integer doInBackground(ArrayList<string>... datas) { 
 ArrayList<string> data = datas[0]; 
 for (int i=0; i<8; i++) { 
  data.add("ListItem"); 
 } 
 return STATE_FINISH; 
} 
 
/* 在doInBackground 执行完成后,onPostExecute 方法将被UI thread调用, 
 * 后台的计算结果将通过该方法传递到UI thread. 
 */
@Override
protected void onPostExecute(Integer result) { 
 int state = result.intValue(); 
 switch(state){ 
 case STATE_FINISH: 
  dismissDialog(PROGRESS_DIALOG); 
  Toast.makeText(getApplicationContext(), 
    "加载完成!", 
    Toast.LENGTH_LONG) 
    .show(); 
 
  adapter = new ArrayAdapter<string>(getApplicationContext(), 
    android.R.layout.simple_list_item_1, 
    data ); 
     
  setListAdapter(adapter); 
 
  break; 
   
 case STATE_ERROR: 
  dismissDialog(PROGRESS_DIALOG); 
  Toast.makeText(getApplicationContext(), 
    "处理过程发生错误!", 
    Toast.LENGTH_LONG) 
   .show();
 
  adapter = new ArrayAdapter<string>(getApplicationContext(), 
    android.R.layout.simple_list_item_1, 
    data );
 
   setListAdapter(adapter);
 
   break;
 
 default:
 
 }
}

Android另外提供了一个工具类:AsyncTask。它使得UI thread的使用变得异常简单。它使创建需要与用户界面交互的长时间运行的任务变得更简单,不需要借助线程和Handler即可实现。