Как запустить один и тот же класс AsyncTask для разных процессов? - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь создать демонстрационное приложение с 2 кнопками, одна загружает видео, а другая загружает 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 ]

0 голосов
/ 23 октября 2018

Не делайте этого

DownloadingClass downloadingClass = new DownloadingClass();

Всегда создавайте непосредственно перед тем, как приступить к выполнению задания:

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

Это потому, что вы не можете повторно использовать AsyncTask.Он имеет статус и больше не будет запускаться после завершения состояния.

0 голосов
/ 23 октября 2018

если у вас одинаковый тип ввода / вывода в обоих методах загрузки, вы можете использовать один и тот же DownloadingClass, объявив объект для каждого метода, например:

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

, затем просто вызовите downloadPDF.execute(); / downloadVideo.execute();

или вы можете управлять ими с помощью ExecutorService: Как ожидать завершения всех потоков, используя ExecutorService?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...