Android:我如何传递参数到AsyncTask的onExExecute()?

我使用AsyncTask来加载我作为内部类实现的操作。

onPreExecute()我显示一个加载对话框,然后我再次隐藏onPostExecute() 。 但是对于我事先知道的一些加载操作,他们会很快完成,所以我不想显示加载对话框。

我想通过一个布尔参数来指示,我可以传递给onPreExecute()但显然由于某种原因onPreExecute()不带任何参数。

显而易见的解决方法可能是在我的AsyncTask或外部类中创build一个成员字段,我必须在每次加载操作之前设置该成员字段,但这看起来不是很优雅。 有一个更好的方法吗?

你可以重写构造函数。 就像是:

 private class MyAsyncTask extends AsyncTask<Void, Void, Void> { public MyAsyncTask(boolean showLoading) { super(); // do stuff } // doInBackground() et al. } 

然后,在调用任务时,请执行以下操作:

 new MyAsyncTask(true).execute(maybe_other_params); 

编辑:这比创build成员variables更有用,因为它简化了任务调用。 比较上面的代码:

 MyAsyncTask task = new MyAsyncTask(); task.showLoading = false; task.execute(); 

1)对于我来说,传递参数到asynchronous任务的最简单的方法就是这样

 // To call the async task do it like this Boolean[] myTaskParams = { true, true, true }; myAsyncTask = new myAsyncTask ().execute(myTaskParams); 

声明并使用这里的asynchronous任务

 private class myAsyncTask extends AsyncTask<Boolean, Void, Void> { @Override protected Void doInBackground(Boolean...pParams) { Boolean param1, param2, param3; // param1=pParams[0]; param2=pParams[1]; param3=pParams[2]; .... } 

2)将方法传递给asynchronous任务为了避免多次对asynchronous任务基础结构(线程,messagenhandler,…)进行编码,您可能会考虑将应该在asynchronous任务中执行的方法作为parameter passing。 以下示例概述了这种方法。 此外,您可能需要inheritanceasynchronous任务以在构造函数中传递初始化参数。

  /* Generic Async Task */ interface MyGenericMethod { int execute(String param); } protected class testtask extends AsyncTask<MyGenericMethod, Void, Void> { public String mParam; // member variable to parameterize the function @Override protected Void doInBackground(MyGenericMethod... params) { // do something here params[0].execute("Myparameter"); return null; } } // to start the asynctask do something like that public void startAsyncTask() { // AsyncTask<MyGenericMethod, Void, Void> mytest = new testtask().execute(new MyGenericMethod() { public int execute(String param) { //body return 1; } }); } 

为什么,如何以及将哪些parameter passing给Asynctask <>,请参阅此处的详细信息 。 我认为这是最好的解释。

谷歌的Android文档说:

asynchronous任务由3个genericstypes定义,称为Params,Progress和Result,以及4个步骤,分别称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

AsyncTask的genericstypes:

asynchronous任务使用的三种types如下:

参数,执行时发送给任务的参数的types。 进度,在后台计算期间发布的进度单位的types。 结果,后台计算结果的types。 并非所有types总是由asynchronous任务使用。 要将某个types标记为未使用,只需使用typesVoid:

  private class MyTask extends AsyncTask<Void, Void, Void> { ... } 

你可以进一步参考: http : //developer.android.com/reference/android/os/AsyncTask.html

或者你可以通过引用Sankar-Ganesh的博客来明确AsyncTask的作用

那么典型的AsyncTask类的结构如下所示:

 private class MyTask extends AsyncTask<X, Y, Z> protected void onPreExecute(){ } 

在启动新线程之前执行此方法。 没有input/输出值,所以只是初始化variables或任何你认为你需要做的事情。

 protected Z doInBackground(X...x){ } 

AsyncTask类中最重要的方法。 你必须把所有你想做的事情放在后台,在与主要的不同的线程中。 在这里我们有一个types为“X”的对象数组作为input值(你在头文件中看到了什么?我们有“… extends AsyncTask”这些是input参数的types)并返回一个types的对象“Z”。

保护无效onProgressUpdate(Y Y){

}使用publishProgress(y)方法调用此方法,通常在您想要在主屏幕中显示任何进度或信息时使用此方法,例如显示您在后台执行的操作进度的进度条。

protected void onPostExecute(Z z){

}这个方法在后台的操作完成后调用。 作为input参数,您将收到doInBackground方法的输出参数。

那么X,Y和Ztypes呢?

从以上结构可以推断出:

 X – The type of the input variables value you want to set to the background process. This can be an array of objects. Y – The type of the objects you are going to enter in the onProgressUpdate method. Z – The type of the result from the operations you have done in the background process. 

我们如何从外部课堂调用这个任务? 只是以下两行:

 MyTask myTask = new MyTask(); myTask.execute(x); 

其中x是typesX的input参数。

一旦我们的任务运行,我们就可以从“外部”中find它的状态。 使用“getStatus()”方法。

myTask.getStatus(); 我们可以收到以下状态:

正在运行 – 表示任务正在运行。

PENDING – 表示该任务尚未执行。

完成 – 表示onPostExecute(Z)已完成。

有关使用AsyncTask的提示

不要手动调用PreExecute,doInBackground和onPostExecute方法。 这是由系统自动完成的。

您不能在另一个AsyncTask或Thread中调用AsyncTask。 方法执行的调用必须在UI线程中完成。

onPostExecute方法在UI线程中执行(在这里你可以调用另一个AsyncTask!)。

任务的input参数可以是一个Object数组,这样你可以放置任何你想要的对象和types。