2010年12月21日 星期二

Android Multi Thread 的簡單範例

撰寫 Desktop Software 時,不使用 Thread 可能會失去不少的靈活性與流暢感,
在 Android 中使用 Thread 的觀念與 C# 中的 BackgroundWorker 很像,
大致上就分成這四個成員


protected void onPreExecute()
{
}

protected void doInBackground()
{
}

protected void onProgressUpdate()
{
}

protected void onPostExecute()
{
}


AsyncTask 在 Android Developers 的文件請參考:public abstract class AsyncTask

若有用過 .Net Framework 中的 BackgroundWorker 就可以發現觀念差不多的,
官方文件可以看 MSDN 的介紹:BackgroundWorker Class

以下是一個簡單的範例,利用繼承 AsyncTask 執行 background work
若想在 Thread 中改變 Main Thread 的元件,也要特別注意範例。

首先建立一個背景作業的類別


public class UploadPhoneTask extends AsyncTask<UserPhoto, integer, boolean>
{
  public void UploadPhoneTask()
  {
    // UserPhoto 在建構時指定也是一種做法
  }

  protected void onPreExecute()
  {
    // UI Thread
    // 將 Activity 中的 Status TextView 更新為 "Uploading..."
    super.onPreExecute();
  }

  protected void doInBackground(UserPhoto photo)
  {
    integer nProgress = 0;
    // 進行上傳作業,並計算已上傳的百分比數
    nProgress = (nUploadSize / nFullSize) * 100;
    publishProgress(nProgress);
    return (nUploadSize == nFullSize); // 此 return 值是給 PostExecute 收的
  }

  protected void onProgressUpdate(integer nProgress)
  {
    // UI Thread
    txtStatus.Text = "Uploading... " + nProgress.ToString() + " %";
  }

  protected void onPostExecute(boolean bSuccess)
  {
    // UI Thread
    if(bSuccess)
    {
      // 上傳成功
    }
    else
    {
      // 上傳失敗
    }
  }
}


使用 UploadPhotoTask 的方法如下


public class MainActivity extends Activity
{
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
    super.onCreate();
    UploadPhotoTask userTask = new UploadPhotoTask();
    // 取得用戶要上傳的圖片並建構 UserPhoto 物件
    userTask.execute(UserPhoto);
  }
}


使用上較 C# 的 BackgroundWorker 麻煩,但管理起來較清晰。

沒有留言:

張貼留言