Почему AsyncTask выполняется, когда метод execute вызывается с использованием экземпляра, но без экземпляра работает нормально? [Дубликат]

Используйте let:

Prelude> :{
Prelude| let addTwo :: Int -> Int -> Int
Prelude|     addTwo x y = x + y
Prelude| :}
Prelude> addTwo 2 3
5
37
задан Vlad 22 March 2016 в 09:51
поделиться

4 ответа

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();
    }

    }
}
80
ответ дан Mehul Joisar 16 August 2018 в 02:21
поделиться
  • 1
    Тонкс! Это похоже на то, что я хотел ...: D – omerjerk 10 January 2013 в 07:27
  • 2
    Я рад помочь :-) – Mehul Joisar 10 January 2013 в 07:35
  • 3
    ИСТИННАЯ разница между Mehul Ranpara и Mehul Joisar здесь - Joisar хочет помочь, не поднимая вопросов, но Ranpara хочет разозлить всех остальных, кто смотрит на этот пост .... Поэтому я приветствую Мехула Джойсара за то, что он был добрым ответом на вопрос, независимо от состояния ... – Vincy 16 December 2016 в 14:47
  • 4
    @Vincy Спасибо! В конце концов, разделение заботится. – Mehul Joisar 16 December 2016 в 15:15

Согласно AsyncTask , его

 AsyncTask<Params, Progress, Result>
  • Params, тип параметров, отправленных в задачу после выполнения.
  • Progress , тип единиц прогресса, опубликованных во время фонового вычисления.
  • Результат, тип результата фонового вычисления.

Итак, если вы хотите передать пустоту в doInBackground просто передайте пустоту вместо 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();
13
ответ дан Name is Nilay 16 August 2018 в 02:21
поделиться
  • 1
    Это означает, что params - это массив задач, и возвращаемый тип всех задач недействителен – blackHawk 16 March 2017 в 09:16
  • 2
    @blackHawk - Да – Name is Nilay 17 March 2017 в 08:40

Почему вы не хотите передавать какие-либо аргументы? Вы должны объяснить ...

Как это обычно работает (пример):

 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

7
ответ дан Oleg Vaskevich 16 August 2018 в 02:21
поделиться
  • 1
    Часто параметры передаются на AsyncTask, но не обязательно – codeMagic 10 January 2013 в 06:59
  • 2
    мне не нужно передавать аргумент doInBakground. этот метод открывает только PHP-файл на моем веб-сервере методом POST. И мне нужно только получить ответ от этого php-файла. Поэтому мне не нужно передавать какие-либо аргументы в doInBackground. – omerjerk 10 January 2013 в 07:00
  • 3
    Простой - вы просто используете класс Void. Таким образом, вы бы private class DownloadFilesTask extends AsyncTask<Void, Integer, Long> {. – Oleg Vaskevich 10 January 2013 в 07:20

Создайте свой 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();
6
ответ дан ρяσѕρєя K 16 August 2018 в 02:21
поделиться
  • 1
    Я заметил, что автозаполнение Android Studio не дает вам «& lt; Void, Void, String & gt;», которое может отключить вас. Также обратите внимание, что возврат для doInBackground действительно должен быть третьим аргументом класса («String» в показанном примере). – Fattie 3 December 2016 в 18:29
Другие вопросы по тегам:

Похожие вопросы: