2011-08-19 144 views
1

我的问题是如何动态地将参数传递给AsyncTask。我如何做到这一点?如何将参数传递给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]); 
     } 
} 

我评论“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) 

请帮我....

在此先感谢

+0

“DownlaodTableActivity()” 什么这个...?是一个活动..? – ngesh

回答

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; 
     } 
... ... 
} 
+0

谢谢你的回答。我会试试这个 – Piraba

0

你的错误列表的第一行说,你的活动不您的活动不在前台。当您的活动处于前台时,您的代码可以正常工作。但在离开活动时会产生此错误。

08-19 09:03:51.552: ERROR/AndroidRuntime(340): android.view.WindowManager$BadTokenException: Unable to add window -- token [email protected] is not valid; is your activity running? 
+0

请告诉我我想做什么? – Piraba

0

这似乎是错误的传球参数& AsyncTask<Void, Integer, Void>在这里,您说的void类型....

0

基于对你的函数的名字,这听起来像你想自动下载东西在后台使用AsyncTask。这不是AsyncTask的目的 - 它是用于在活动用户界面的背景下进行操作的。我认为你真正想使用的是带有自己线程的服务,并使用由AlarmManager发送的意图启动服务。