2015年3月18日 星期三

[Android] AsyncTask


Android: How can I pass parameters to AsyncTask's onPreExecute()?
You can override the constructor. Something like:
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
 
    public MyAsyncTask(boolean showLoading) {
        super(); 
        // do stuff 
    } 
 
    // doInBackground() et al. 
} 
Then, when calling the task, do something like:
new MyAsyncTask(true).execute(maybe_other_params);

Edit: this is more useful than creating member variables because it simplifies the task invocation. Compare the code above with:
MyAsyncTask task = new MyAsyncTask();
task.showLoading = false;
task.execute();
referemce:http://stackoverflow.com/questions/3075009/android-how-can-i-pass-parameters-to-asynctasks-onpreexecute


AsyncTask使用方式如下,

activity_main.xml

    

MainActivity.java
package tw.brad.android.book.MyAsyncTask;

import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;

public class MainActivity extends Activity {
 private View start, end;
 private TextView mesg;
 private MyMealTime task;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  start = findViewById(R.id.start);
  end = findViewById(R.id.end);
  mesg = (TextView) findViewById(R.id.msg);

  start.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    task = new MyMealTime();
    //傳遞多個參數給AsyncTask運作處理
    task.execute("breakfast", "lunch", "dinner");
   }
  });

  end.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    // 提早結束AsyncTask
    if (task != null && !task.isCancelled()) {
     task.cancel(true);
    }
   }
  });

 }

 private class MyMealTime extends AsyncTask < String, Integer, String>{
  private String[] name;
  private boolean isOver;

  @Override
  protected String doInBackground(String... names) {
   name = names;
   for (int i = 0; i < 10; i++) {
    try {
     // 傳遞三個參數處理使用者介面
     publishProgress(i, i + 20, i+40);
     Thread.sleep(1500); // 暫停休眠
     
     // 如果提早結束
     if (isCancelled()) {
      isOver = true;
      break;
     }

    } catch (InterruptedException e) {
     e.printStackTrace();
    }
   }
   
   // 提早結束傳會null; 否則正常下傳回結果參數
   return isOver?null:"終於執行結束";
  }

  @Override
  protected void onCancelled() {
   super.onCancelled();
   mesg.setText("提早結束");
  }

  @Override
  protected void onPostExecute(String result) {
   super.onPostExecute(result);
   // 將接收執行結束厚的結果參數顯示在使用者介面
   mesg.setText("Result:" + result);
  }

  @Override
  protected void onPreExecute() {
   super.onPreExecute();
  }

  @Override
  protected void onProgressUpdate(Integer... values) {
   super.onProgressUpdate();
   int i = values[0]; 
   String result="";
   if(name[i%3].equals("breakfast")){
    result=name[i%3] + " at 6:" + values[i%3]+" am";
   }else if(name[i%3].equals("lunch")){
    result=name[i%3] + " at 13:" + values[i%3]+" pm";
   }else if(name[i%3].equals("dinner")){
    result=name[i%3] + " at 19:" + values[i%3]+" pm";
   }
   
   // 將執行過程的傳遞參數顯示在使用者介面
   mesg.setText(result);
  }
 }
} 

沒有留言:

張貼留言