无痛线程

来源:互联网 发布:用友nc数据备份 编辑:程序博客网 时间:2024/06/11 03:15


Android UI toolkit不是线程安全的,所以在UI线程之外操作它们要小心了。

Android提供从其它线程访问UI线程的方法如下:

1)  Activity.runOnUiThread(Runnable)

2)  View.post(Runnable)

3)  View.postDelayed(Runnable, long)

4)  Handler

一个有bug的例子:

public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
      Bitmap b = loadImageFromNetwork();
      mImageView.setImageBitmap(b);
    }
  }).start();
}

使用上面提到的4种方法之一解决bug:

public void onClick(View v) {
  new Thread(new Runnable() {
    public void run() {
      final Bitmap b = loadImageFromNetwork();
      mImageView.post(new Runnable() {
        public void run() {
          mImageView.setImageBitmap(b);
        }
      });
    }
  }).start();
}

但不幸的事情又发生了,这使得你的程序可读性和可理解下变差。为了彻底解决这个问题,android 1.5+提供了一个AsyncTask的辅助类,这简化了长时间运行任务的建立需要跟UI交互的问题。AsyncTask可以帮你管理线程,重写的代码如下:

public void onClick(View v) {
  new DownloadImageTask().execute("http://example.com/image.png");
}

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
     protected Bitmap doInBackground(String... urls) {
         return loadImageFromNetwork(urls[0]);
     }

     protected void onPostExecute(Bitmap result) {
         mImageView.setImageBitmap(result);
     }
 }

不管你用不用AsyncTask,永远记住单一线程模型的两个规则:

1)  不要block UI线程

2)  保证你只会在UI线程里访问android UI toolkit

原创粉丝点击