2015年7月2日 星期四

[擒猿心法篇] Android 中更新 UI 的方法

Android 中只有 UI Thread 才能更新 UI,否則會發生 Exception。

幹你娘,好煩阿!

以下幾種方法可以協助達成更新 UI 的方法,紀錄一下:

1. 呼叫 runOnUiThread

http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable)
final void
Runs the specified action on the UI thread.
使用方式如下:
runOnUiThread.(new Runnable() {
    public void run() {
        myTextView.setText("update");
    }
});

2. 呼叫 View 本身的 post 方法

http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)
boolean
post(Runnable action)
Causes the Runnable to be added to the message queue.
使用方式如下:
myTextView.post(new Runnable() {
    public void run() {
        myTextView.setText("update")
    }
});

3. 使用 Handler

http://developer.android.com/reference/android/os/Handler.html
透過 Handler 可以 發送 Message 請 UI Thread 處理更新 UI。
使用方式如下:
mHandler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
      myTextView.setText("update");
      super.handleMessage(msg);
   }
};

Message msg = new Message();
mHandler.sendMessage(msg);

4. 使用 AsyncTask

http://developer.android.com/reference/android/os/AsyncTask.html
AsyncTask 可以在背景做運算,並把結果傳給 UI thread 進行更新,通會常用在需要處理大量運算等狀況下。
使用方式如下:
private class LoadImage extends AsyncTask {
    protected String doInBackground(String... url) {
        return loadImageFormNetwork(url[0]);
    }
    protected void onPostExecute(String result) {
        myImage.setImage(result);
    }
}

new loadImageTask().execute("www.xxx.com/image.png");


reference: http://gameorprogram.blogspot.tw/2011/12/android-ui.html

沒有留言:

張貼留言