android中的asyntask参数有什么区别?

时间:2013-04-12 04:13:05

标签: android android-asynctask

正如我的问题所说,我指的是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?

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

5 个答案:

答案 0 :(得分:4)

异步任务由3个泛型类型(称为Params, Progress and Result)和4个步骤(称为onPreExecutedoInBackgroundonProgressUpdateonPostExecute定义。< / p>

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:view source print?

   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 */
          }
   }

答案 1 :(得分:3)

如果您不需要一个或多个AsyncTask参数,请使用Void(请注意大写字母V为Void而不是void)。< / p>

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

例如......

onPostExecute()

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

有关AsyncTask的更多详细信息。

答案 4 :(得分:0)

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

AsyncTask的泛型类型

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

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

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

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

  4. 并非所有类型都始终由异步任务使用。 要将类型标记为未使用,只需使用类型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);