在讲解更新UI方法前,我们先来了解一些概念:
当应用启动,系统会创建一个主线程(main thread)。这个主线程负责向UI组件分发事件(包括绘制事件),UI的更新也必须在主线程中完成,让主线程做处理,因此也可以说,主线程即UI线程。主线程主要的职责是:(1)快速处理UI事件,(2)快速处理Broadcast消息。
我们的耗时操作不能阻塞主线程,要保证应用的响应性, 所以当你的操作不是即时的那种(not instantaneous),你应该把他们放进单另的线程中(叫做background或者叫worker线程)。
了解了这些后,我们就知道为什么需要在另外的线程中进行耗时操作,然后再更新UI的时候切换回主线程进行页面更新,Android提供了一下这几种方法用于UI更新:
一、runOnUiThread()
1.定义runable要执行的操作:
private Activity mActivity= this;
private Runnable mRunnable;
mRunnable = new Runnable() {
@Override
public void run() {
mTextView3.setText("UI update success");
}
};
2.使用的时候:mActivity.runOnUiThread(mRunnable);
二、view.post()
1.定义runable要执行的操作:同上
2.使用的时候:mTextView3.post(mRunnable);
三、Handler:略
四、AsyncTask:摘自http://www.cnblogs.com/wenjiang/p/3180324.html
AsyncTask的原理和Handler很接近,都是通过往主线程发送消息来更新主线程的UI,这种方式是异步的,所以就叫AsyncTask。使用AsyncTask的场合像是下载文件这种会严重阻塞主线程的任务就必须放在异步线程里面:
public class MainActivity extends Activity {
private Button mButton;
private ImageView mImageView;
private ProgressBar mProgressBar;
@SuppressLint("HandlerLeak")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mButton = (Button) this.findViewById(R.id.button);
mImageView = (ImageView) this.findViewById(R.id.image);
mProgressBar = (ProgressBar) this.findViewById(R.id.progressBar);
mButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AsyncTaskThread thread = new AsyncTaskThread();
thread.execute("http://g.search2.alicdn.com/img/bao/uploaded/i4/"
+ "i4/12701024275153897/T1dahpFapbXXXXXXXX_!!0-item_pic.jpg_210x210.jpg");
}
});
}
class AsyncTaskThread extends AsyncTask<String, Integer, Bitmap> {
@Override
protected Bitmap doInBackground(String... params) {
publishProgress(0);
HttpClient client = new DefaultHttpClient();
publishProgress(30);
HttpGet get = new HttpGet(params[0]);
final Bitmap bitmap;
try {
HttpResponse response = client.execute(get);
bitmap = BitmapFactory.decodeStream(response.getEntity()
.getContent());
} catch (Exception e) {
return null;
}
publishProgress(100);
return bitmap;
}
protected void onProgressUpdate(Integer... progress) {
mProgressBar.setProgress(progress[0]);
}
protected void onPostExecute(Bitmap result) {
if (result != null) {
Toast.makeText(MainActivity.this, "成功获取图片", Toast.LENGTH_LONG)
.show();
mImageView.setImageBitmap(result);
} else {
Toast.makeText(MainActivity.this, "获取图片失败", Toast.LENGTH_LONG)
.show();
}
}
protected void onPreExecute() {
mImageView.setImageBitmap(null);
mProgressBar.setProgress(0);
}
protected void onCancelled() {
mProgressBar.setProgress(0);
}
}
@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;
}
}
注意:AsyncTask最多支持127线程,超128线程就会崩溃。