代码之家  ›  专栏  ›  技术社区  ›  Levent Ozbek

如何为不同的进程运行相同的AsyncTask类?

  •  0
  • Levent Ozbek  · 技术社区  · 6 年前

    我正在尝试用两个按钮构建一个演示应用程序,一个下载视频,另一个下载PDF。我想在后台线程中通过 AsyncTask . 到目前为止,我已经有了带有实现方法的启动代码。我还没有为我想要下载的内容添加代码,因为我想找出单独下载背后的逻辑,所以现在我有日志消息。

    这是代码:

    public class MainActivity extends AppCompatActivity {
        Button downloadVideo, downloadPDF;
        DownloadingClass downloadingClass = new DownloadingClass();
        private static final String TAG = "omar.asynctaskdemo;";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            downloadVideo = findViewById(R.id.download_video);
            downloadPDF = findViewById(R.id.download_pdf);
    
            downloadVideo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {}
            });
    
            downloadPDF.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {}
            });
        }
    
        private class DownloadingClass extends AsyncTask<Void, Void, Void>{
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                Log.d(TAG, "doInBackground: Before");
            }
    
            @Override
            protected void onPostExecute(Void aVoid) {
                super.onPostExecute(aVoid);
                Log.d(TAG, "doInBackground: After");
            }
    
            @Override
            protected void onProgressUpdate(Void... values) {
                super.onProgressUpdate(values);
                Log.d(TAG, "doInBackground: Progress");
            }
    
            @Override
            protected Void doInBackground(Void... voids) {
                Log.d(TAG, "doInBackground: Content to download");
                return null;
            }
        }
    }
    

    我希望能得到一个关于如何进行的简明解释。

    2 回复  |  直到 6 年前
        1
  •  2
  •   AIMIN PAN    6 年前

    不要这样做

    DownloadingClass downloadingClass = new DownloadingClass();
    

    总是在开始任务之前创建:

    new DownloadingClass().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
    

    这是因为您不能重用AsyncTask。它具有状态,一旦状态为“完成”,将不会再次运行。

        2
  •  1
  •   Ali Reza    6 年前

    如果两种下载方法中的输入/输出类型相同,则可以使用相同的 DownloadingClass 通过为每个方法声明一个对象,例如:

    DownloadingClass downloadPDF = new DownloadingClass();
    DownloadingClass downloadVideo = new DownloadingClass();
    

    然后打电话 downloadPDF.execute(); / downloadVideo.execute();

    或者你可以通过 ExecutorService : How to wait for all threads to finish, using ExecutorService?