2015-06-12 3 views
0

У меня есть класс MainActivity в моем проекте Android. Внутри него у меня есть AsyncTask, чтобы получить всю информацию о моем Cars с методом GET моего API REST, и я хочу добавить их в ArrayList, который у меня есть в моем классе MainActivity. Из-за этого я хотел добавить ProgressDialog, которые заканчиваются в то же время, что и моя AsyncTask.Почему мой прогрессDialog никогда не заканчивается?

Я объявил свою ProgressDialog на вершине моего MainActivity:

private ProgressDialog progressDialog; 

А также, мой ArrayList автомобилей это определено на верхней части моего MainActivity:

ArrayList<Car> cars = new ArrayList<Car>(); //This is the ArrayList that I have on my MainActivity class 

Затем я бегу мой AsyncTask и инициализировать мой ProgressDialog в методе onCreate моего MainActivity класс:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     progressDialog = new ProgressDialog(MainActivity.this); 
     progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.setCancelable(true); 
     progressDialog.setMax(100); 

     new chargeCars().execute(); 
    } 

А вот это мой AsyncTask:

class chargeCars extends AsyncTask<Void, Integer, Boolean> { 

    protected void onPreExecute(){ 
     progressDialog.setProgress(0); 
     progressDialog.show(); 
    } 

    protected Boolean doInBackground(Void... params) { 

     //Here all the code to get my information from an HTTP Response, the data it's retrieving OK. 

      //Here there is a for loop to add all the elements to my ArrayList cars. 
      { 
       cars.add(new Car(idCar, model)); 

       publishProgress(10); 

       if(isCancelled()) 
        break; 
      } 

     publishProgress(100); 
     return true; 
    } 

    protected void onProgressUpdate(Integer... values){ 
     int progress = values[0].intValue(); 

     progressDialog.setProgress(progress); 
    } 

    protected void onPostExecute(boolean c){ 

     if(c) 
     { 
      Toast.makeText(MainActivity.this, "Finished task!", 
        Toast.LENGTH_SHORT).show(); 
     } 

     if(progressDialog != null && progressDialog.isShowing()){ 
      progressDialog.dismiss(); 
     } 
    } 

    protected void onCancelled() { 
     Toast.makeText(MainActivity.this, "Canceled task", 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

Проблема это, что ProgressDialog никогда не заканчивается, это всегда на экране. Почему он всегда отображается? Всегда ли работает моя AsyncTask? Никогда не заканчивается?

Примечание: информация моего ответа HTTP это хорошо подходит из моего API REST, потому что я положил некоторые журналы после того как я получить информацию, и это правильно и, видимо, она хранится в ArrayList (я ставлю некоторые журналы тоже после добавьте информацию в мой ArrayList, и она дает мне информацию, хранящуюся), но когда я положил cars.size() после выполнения моего AsyncTask по методу onCreate(), он дает мне, чтобы размер равнялся 0. Это причина, по которой я положил свой ProgressDialog внутри моего AsyncTask, потому что я думаю, что это, возможно, еще не закончилось, и тогда я уверен, что AsyncTask закончен. Это может быть решение? Я должен сделать еще одно изменение?

Пожалуйста, принесите мне свет, потому что я полностью заблокирован здесь.

EDIT: Я отредактировал мой код.

EIDT 2: С обновленным кодом ProgressDialog исчезает только при касании экрана моего мобильного телефона. В других случаях он не исчезает.

Заранее благодарен!

ответ

0

В вашем onPostExecute добавить,

if(progressDialog != null && progressDialog.isShowing()){ 
     progressDialog.dismiss(); 
    } 
+0

Он также осуществляет себя все время, никогда не заканчивается , Почему это может быть? –

0

использовать метод dismiss()!

@override 
    protected void onPostExecute(boolean c){ 

      if(c) 
      { 
       Toast.makeText(MainActivity.this, "Finished task!", 
         Toast.LENGTH_SHORT).show(); 
      } 
      if(progressDialog != null && progressDialog.isShowing()){ 
       progressDialog.dismiss(); 
      } 
     } 

уволить()

Добавлено в уровне API 1 Отклонить это диалоговое окно, удалив его с экрана. Этот метод можно безопасно вызывать из любого потока.Обратите внимание, что вы не должны переопределять этот метод, чтобы выполнить очистку, когда диалог отклонен, вместо этого реализуем это в onStop().

+0

Я добавил, что 'Jayesh Elamgodil' сказал мне, но это тоже не сработало. В чем может быть проблема? –

+0

эй! Я думаю, что вам не хватает @override для меток AsyncTask. – Jorgesys

+0

И какова его разница в использовании @overrride или нет? –

0

Проблема заключается в том, что ваши методы и onDestroy в вашем AsyncTask ничего в классе не отменяет и не поэтому никогда не называют. Если вам нужно что-то сделать, когда закончится AsyncTask, вы поместите его в метод onPostExecute (который работает в потоке пользовательского интерфейса). Вы должны удалить эти два метода (так как они бесполезны) и установить метод onPostExecute следующим образом:

protected void onPostExecute(boolean c){ 
    if(c) { 
     Toast.makeText(MainActivity.this, "Finished task!", 
       Toast.LENGTH_SHORT).show(); 
    } 

    if(progressDialog != null && progressDialog.isShowing()){ 
     progressDialog.dismiss(); 
    } 
} 

Смотрите Android docs методов, доступных в AsyncTask

+0

У меня есть некоторые сомнения. Что именно вы имеете в виду, когда говорите, что «не переоценивайте ничего». Что означает переопределение? (Извините, если это вопрос obvius). И еще одно сомнение: перед этим выполняется еще одна работа AsyncTask, которая устанавливает значения в CustomAdapter, который показывает значения в списке. До (с методами onPause и onDestroy) он не появляется, теперь он появляется. Но ProgressDialog все еще отображается, и информация второй AsyncTask не появляется. Возможно, что первая AsyncTask блокирует вторую? Спасибо! –

Смежные вопросы