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-onpreexecuteAsyncTask使用方式如下,
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); } } }
沒有留言:
張貼留言