如何在 Android 中正确使用 AsyncTask [关闭]

Posted

技术标签:

【中文标题】如何在 Android 中正确使用 AsyncTask [关闭]【英文标题】:How to use AsyncTask correctly in Android [closed] 【发布时间】:2012-12-24 10:20:52 【问题描述】:

我不想将任何参数传递给 AsyncTask 的 doInBackground 方法。

那么代码应该是什么样的?

【问题讨论】:

在发布内容之前先尝试一下...阅读博客和开发者指南 你必须阅读......click here 【参考方案1】:
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;

public class AsyncExample extends Activity


private String url="http://www.google.co.in";

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);



@Override
protected void onResume() 
    // TODO Auto-generated method stub
    super.onResume();

    new AsyncCaller().execute();



private class AsyncCaller extends AsyncTask<Void, Void, Void>

    ProgressDialog pdLoading = new ProgressDialog(AsyncExample.this);

    @Override
    protected void onPreExecute() 
        super.onPreExecute();

        //this method will be running on UI thread
        pdLoading.setMessage("\tLoading...");
        pdLoading.show();
    
    @Override
    protected Void doInBackground(Void... params) 

        //this method will be running on background thread so don't update UI frome here
        //do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here


        return null;
    

    @Override
    protected void onPostExecute(Void result) 
        super.onPostExecute(result);

        //this method will be running on UI thread

        pdLoading.dismiss();
    

    

【讨论】:

谢谢!这看起来像我想要的......:D【参考方案2】:

根据AsyncTask,其

 AsyncTask<Params, Progress, Result>
Params,执行时发送给任务的参数类型。 进度,进度单位在期间发布的类型 后台计算。 Result,后台计算结果的类型。

所以如果你想在 doInBackground 中传递 void,只需传递 void 来代替 Params。

示例代码:

class DownloadLink extends AsyncTask<Void, Void, Void> 


        @Override
        protected Void doInBackground(Void... params) 
            // TODO Auto-generated method stub

            //Do Your stuff here..
            return null;
        
    

并将其称为:

 new DownloadLink().execute();

【讨论】:

表示params是任务数组,所有任务的返回类型都是void @blackHawk - 是的【参考方案3】:

创建您的 AsyncTask 类,就好像您不想将任何参数传递给 doInBackground 一样:

 public class LongOperation extends AsyncTask<Void, Void, String> 


          public LongOperation(Context context) 

          

          @Override
          protected void onPreExecute() 

          

          @Override
          protected String doInBackground(Void... params) 

              return null;
                

          @Override
          protected void onPostExecute(String result)                            

          
    

并在不传递任何参数的情况下启动 AsyncTask :

   LongOperation longOperation = new LongOperation(this);
   longOperation.execute();

【讨论】:

我注意到 Android Studio 自动完成不会给你“”,这可能会让你绊倒。另外,请注意doInBackground 的返回值确实必须是类的第三个参数(所示示例中的“String”)。【参考方案4】:

你为什么不想给它传递任何参数呢?你应该解释...

这是它通常的工作方式(示例):

 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");
     
 

然后调用它来执行它:

new DownloadFilesTask().execute(url1, url2, url3);

来源:Android docs

【讨论】:

通常,参数传递给AsyncTask但不是必须的 我不需要将参数传递给 doInBakground 。此方法仅通过 POST 方法在我的 Web 服务器上打开一个 php 文件。我只需要从那个 php 文件中得到响应。所以我不需要将任何参数传递给doInBackground 简单 - 您只需使用 Void 类。所以你会有private class DownloadFilesTask extends AsyncTask&lt;Void, Integer, Long&gt;

以上是关于如何在 Android 中正确使用 AsyncTask [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中正确使用暗模式(nicht)?

如何在 Android 中正确使用 AsyncTask [关闭]

Android,如何在 Parcelable 类中正确使用 readTypedList 方法?

如何在 android studio 中正确使用 postDelayed()?

如何在 Android 中使用 JNI 将资产 FileDescriptor 正确传递给 FFmpeg

如何在android中正确关闭光标