2

正如我的问题所说,我指的是http://developer.android.com/reference/android/os/AsyncTask.html

它告诉我

  Asyntask <params, progress, result> 

但我没有使用进度。是按照你的安排的吗?或者它有一个规则?

例如:

   class loadingdata extends AsyncTask<?,?,?>
   protected void onPreExecute() {}
   protected String doInBackground(String... args) {} 
   protected void onPostExecute() {}

所以我应该将 3 参数插入为

asyntask <void String void> ? 

或者它有一个规则

<preExecute, postExecute, doInBackground> or so fourth?

请帮助我,我是初学者,我不明白。

4

5 回答 5

4

异步任务由 3 个泛型类型(称为)和Params, Progress and Result4 个步骤(称为onPreExecutedoInBackground和)定义。onProgressUpdateonPostExecute

AsyncTask 的泛型类型:

异步任务使用的三种类型如下:

 Params -> the type of the parameters sent to the task upon execution.
 Progress -> the type of the progress units published during the background computation.
 Result -> the type of the result of the background computation.

并非所有类型都始终由异步任务使用。要将类型标记为未使用,只需使用类型 Void:

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

AsyncTask 并实现了 4 个方法:

1. doInBackground:执行长时间运行的代码在这个方法中。当 onClick 方法在单击按钮时执行时,它会调用 execute 方法,该方法接受参数并自动调用 doInBackground 方法并传递参数。

2. onPostExecute:在doInBackground方法完成处理后调用该方法。doInBackground 的结果被传递给这个方法。

3. onPreExecute:在调用doInBackground方法之前调用该方法。

4. onProgressUpdate:这个方法是通过在doInBackground调用这个方法的任何时候调用publishProgress来调用的。

     Overriding onPostExecute, onPreExecute and onProgressUpdate is optional.

要记住的要点:

 1. Instance of Async Task needs to be created in UI thread. As shown in  onClick method a new instance of LongOperation is created there. Also execute method with parameters should be called from UI thread.

  2. Methods onPostExecute, onPreExecute and onProgressUpdate  should not be explicitly called.

 3. Task can be executed only once.

让我们看一个示例类 LongOperation,它扩展了下面的 AsyncTask:查看源打印?

   private class LongOperation extends AsyncTask<String, Void, String> {
   @Override
   protected String doInBackground(String... params) {
          // perform long running operation operation
          return null;
   }
   /* (non-Javadoc)
   * @see android.os.AsyncTask#onPostExecute(java.lang.Object)
   */
   @Override
   protected void onPostExecute(String result) {
          // execution of result of Long time consuming operation
   }
   /* (non-Javadoc)
   * @see android.os.AsyncTask#onPreExecute()
   */
   @Override
   protected void onPreExecute() {
   // Things to be done before execution of long running operation. 
   //For example showing ProgessDialog
   }
   /* (non-Javadoc)
   * @see android.os.AsyncTask#onProgressUpdate(Progress[])
   */
   @Override
   protected void onProgressUpdate(Void... values) {
          /* Things to be done while execution of long running operation 
          is in progress.
          For example updating ProgessDialog */
          }
   }
于 2013-04-12T04:35:10.140 回答
3

如果您不需要一个或多个AsyncTask参数,请使用Void(注意大写的 V 是Void而不是void)。

的签名中AsyncTask<params, progress, result>,第一个是传递给的数组doInBackground()类型,第二个是调用publishProgress()which调用时使用的数组类型,第三个是返回并传递给onProgressUpdate()的数据类型。doInBackdround()onPostExecute()

例如...

private class MyAsyncTask extends AsyncTask<String, Integer, Boolean>

...这意味着方法签名将是...

doInBackground(String... params)
onProgressUpdate(Integer... progress)
onPostExecute(Boolean result)
于 2013-04-12T04:32:41.280 回答
0

由于 AsyncTask 具有通用参数,因此您必须提供所有这些参数。如果您不使用它们中的任何一个,那么您提供的类型并不重要。

于 2013-04-12T04:16:55.550 回答
0

类型是通用的,因此您可以使用任何类或原始类型。当你想要执行时 AsyncTasks 中的语句通过创建它的实例来使用它,然后为该实例调用 execute()。

转到: http: //mysecretishelloworld.blogspot.in/2013/04/asynctask-usage-guide.html

有关 AsyncTask 的更详细使用。

于 2013-04-12T04:24:57.327 回答
0

http://developer.android.com/reference/android/os/AsyncTask.html

AsyncTask 的泛型类型

异步任务使用的三种类型如下:

  1. Params,执行时发送给任务的参数类型。

  2. 进度,在后台计算期间发布的进度单元的类型。

  3. Result,后台计算结果的类型。

并非所有类型都始终由异步任务使用。要将类型标记为未使用,只需使用类型 Void:

私有类 MyTask 扩展 AsyncTask { ... }

例子

    private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected Long doInBackground(URL... urls) {
     int count = urls.length;
     long totalSize = 0;
     for (int i = 0; i < count; i++) {
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
         // Escape early if cancel() is called
         if (isCancelled()) break;
     }
     return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
 }
 }

 URL parameter for doInBackground(URL... urls)
 You call publishProgress((int)somevalue) in doinBackground() to update progress.
 Integer parameter for onProgressUpdate(Integer... progress)  
 Long (result) parameter for onPostExecute(). The result is received from doInBackground().    

用法

  new DownloadFilesTask().execute(url1, url2, url3);
于 2013-04-12T04:31:46.380 回答