2015-01-31 2 views
1

У меня есть отдельный класс (а не Activity) для управления изображением с его свойствами.onPostExecute не работает

В этом классе (Image.class) я также создал AsynkTask для загрузки растрового изображения из Интернета. Все работает отлично, за исключением того факта, что AsyncTask продолжает работать, без запуска метода onPostExecute().

Может кто-нибудь мне помочь, пожалуйста?

Я создаю экземпляр этого класса в Основной деятельности, внутри цикла.

public class InstaImage { 

public URL thumbUrl; 
public URL lowresUrl; 
public URL standardresUrl; 

private URL url; 
private Bitmap bmp; 

public InstaImage(URL _thumb, URL _low, URL _standard) { 
    this.thumbUrl = _thumb; 
    this.lowresUrl = _low; 
    this.standardresUrl = _standard; 
} 

public Bitmap getBitmap(String resolution) { 

    switch(resolution) { 
     case "thumb": 
      url = thumbUrl; 
      break; 

     case "low": 
      url = lowresUrl; 
      break; 

     case "standard": 
      url = standardresUrl; 
      break; 
    } 

    DownloadImageTask dit = new DownloadImageTask(); 

    dit.execute(); 

    // --- TEST ASYNC STATUS --- 
    while(dit != null) { 

     if(dit.getStatus() == AsyncTask.Status.FINISHED) { 
      Log.i("ASYNC", "END2!!"); 
      break; 
     } 
     else { 
      Log.w("ASYNC WAITING", dit.getStatus().toString()); 
     } 
    } 

    // --- END TEST ASYNC STATUS --- 

    return bmp; 
} 

private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
    URLConnection conn = null; 
    InputStream in = null; 
    Bitmap _bmp = null; 

    @Override 
    protected Bitmap doInBackground(String... urls) { 
     Log.i("ASYNC","STARTING!!"); 
     try { 
      conn = url.openConnection(); 

      if (conn != null) { 

       in = conn.getInputStream(); 

       _bmp = BitmapFactory.decodeStream(in); 

       in.close(); 
      } 
     } 
     catch (IOException e) { 
      e.printStackTrace(); 
     } 
     Log.i("ASYNC","END0!!"); 

     return _bmp; 
    } 


    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 
     Log.i("ASYNC","END1!!"); 
     bmp = result; 
    } 
} 
} 
+0

'while (dit! = Null)' - как бы 'dit' когда-нибудь стать нулевым? – stkent

+0

a от силы _true_ аргумент, чтобы код работал .. @michele, вы получаете исключение пойманное? – Elltz

+0

это ** очень ** неясный. Просто напишите 'while (true)' – Andy

ответ

0

У вас возникло непонимание того, как работают нити. Вы используете асинхронный вызов, а затем заняты, ожидая завершения.

// --- TEST ASYNC STATUS --- 
while(dit != null) { 

    if(dit.getStatus() == AsyncTask.Status.FINISHED) { 
     Log.i("ASYNC", "END2!!"); 
     break; 
    } 
    else { 
     Log.w("ASYNC WAITING", dit.getStatus().toString()); 
    } 
} 

// --- END TEST ASYNC STATUS --- 

return bmp; 

Извините, но вам, вероятно, нужно немного почитать по этой теме.

Я предлагаю сделать класс InstaImageView extends ImageView и добавить в него асинхронный загрузчик URI. Я уверен, что этот код был написан тысячу раз. Вы можете просто скопировать его, если вы не понимаете потоки и асинхронное программирование.

+0

Да, я новичок в асинхронном программировании. Вот почему я пытаюсь выяснить свою вину. AsyncTask обрабатывался перед классом основной активности. – Michele

+0

Но тогда мне нужен был класс со специфическими свойствами для изображения, и я нашел логику, чтобы этот новый класс обрабатывал загрузку изображения, как часть его. Я думаю, что моя ошибка заключалась в том, чтобы вызвать процесс Asynk из класса, который, как вы говорите, не расширяет какой-либо вид. Я решил поместить тест цикла while сразу после того, как увидел много попыток, что метод onPostExecute (даже с отметкой @Override) никогда не запускался. @ Andy – Michele

-1

Почему вы вернулись из doInBackground fuction?

return _bmp; // Нет необходимости возвращаться сюда // Результат будет автоматически переходить на onPostExcute()

+0

Поскольку doInBackground дает мне недостающую ошибку возврата, если я не знаю, сделайте это. – Michele

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