如何将参数传递给Android AsyncTask

Pir*_*aba 1 android

我的问题是如何动态地将参数传递给AsyncTask.我是怎么做到的

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.daily_download);

    SharedPreferences myPrefs = this.getSharedPreferences("myLogedPrefs",MODE_WORLD_READABLE);
    strBusinessUnit = myPrefs.getString("BusinessUnit", "");
    strExecutive = myPrefs.getString("Executive", "");
    strTerritoryCode = myPrefs.getString("TerritoryCode", "");

    tableListGrid = (GridView)findViewById(R.id.dailydownloadgrid);
    tableListGrid.setAdapter(new TableListImageAdapter(this));
    tableListGrid.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView parent, View v, int position,long id) {
            if (position == 0) {
                dailyDownTable = "LoadTarget";
                jsonFilter = "Target1";
                new DailyDownldAsyncTask().execute();
            }
        }
    });
}



    public class DailyDownldAsyncTask extends AsyncTask<Void, Integer, Void> {
        // private final ProgressDialog dialog = new ProgressDialog(DailyDownloadActivity.this);
         int myProgress;

        @Override
        protected void onPostExecute(Void result) {

            //if (this.dialog.isShowing()) {
            //  this.dialog.dismiss();
            //}
            //Toast.makeText(DailyDownloadActivity.this,"Download successfully",Toast.LENGTH_SHORT).show();

        }

      @Override
      protected void onPreExecute() {

         // this.dialog.setMessage("Downloading Table Data.......");
         // this.dialog.show();
         // myProgress = 0;
      }

      @Override
      protected Void doInBackground(Void... params) {
          new DownlaodTableActivity().loadDailyDownloadData(dailyDownTable,jsonFilter,strBusinessUnit, strBusinessUnit,strTerritoryCode);
       return null;
      }

      @Override
      protected void onProgressUpdate(Integer... values) {
         // dialog.setProgress(values[0]);
      }
 }
Run Code Online (Sandbox Code Playgroud)

我评论'ProgressDialog'并运行代码我也得到错误这里loadDailyDownloadDatadailyDownTable,jsonFilter,strBusinessUnit, strBusinessUnit,strTerritoryCode)方法我想传递参数.

当我运行此代码时,我收到错误:

     08-19 09:22:15.521: ERROR/AndroidRuntime(457): FATAL EXCEPTION: AsyncTask #2
08-19 09:22:15.521: ERROR/AndroidRuntime(457): java.lang.RuntimeException: An error occured while executing doInBackground()
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at java.lang.Thread.run(Thread.java:1019)
08-19 09:22:15.521: ERROR/AndroidRuntime(457): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at android.os.Handler.<init>(Handler.java:121)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at android.app.Activity.<init>(Activity.java:680)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at com.xont.controller.syn.DownlaodTableActivity.<init>(DownlaodTableActivity.java:62)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at com.xont.controller.admin.DailyDownloadActivity$DailyDownldAsyncTask.doInBackground(DailyDownloadActivity.java:83)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at com.xont.controller.admin.DailyDownloadActivity$DailyDownldAsyncTask.doInBackground(DailyDownloadActivity.java:1)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
08-19 09:22:15.521: ERROR/AndroidRuntime(457):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
Run Code Online (Sandbox Code Playgroud)

请帮我 ....

提前致谢

don*_*gcn 5

似乎您需要首先阅读AsyncTask的文档.http://developer.android.com/reference/android/os/AsyncTask.html

崩溃问题:

请记住,doInBackground将在后台线程中执行.您看到的崩溃问题是DownlaodTableActivity在后台线程中实例化,这在Android框架中是不可能的.(与参数传递无关)所有活动必须在主UI线程中实例化.如果您已在UI线程中实例化它,则将调用Looper.prepare().

解决方案:将loadDailyDownloadData移动到不依赖于DownlaodTableActivity的其他类.如果要在DownlaodTableActivity中更新UI,请在下载数据后在UI线程中执行此操作.

参数传递:

strBusinessUnit = myPrefs.getString("BusinessUnit", "");
strExecutive = myPrefs.getString("Executive", "");
strTerritoryCode = myPrefs.getString("TerritoryCode", "");
... ...
new DailyDownldAsyncTask().execute(dailyDownTable, jsonFilter, strBusinessUnit, strExecutive, strTerritoryCode);
... ...

public class DailyDownldAsyncTask extends AsyncTask<String, Integer, Void> {
        // private final ProgressDialog dialog = new ProgressDialog(DailyDownloadActivity.this);
         int myProgress;

... ...

      @Override
      protected Void doInBackground(Void... params) { 
dailyDownloadData(params[0],params[1],params[2], params[3],params[4];
       return null;
      }
... ...
 }
Run Code Online (Sandbox Code Playgroud)