2014-10-06 2 views
6

Почему я получаю в AsyncTask, который должен быть android.os.NetworkOnMainThreadException? Я думал, что решение AsyncTask является решением этой проблемы. Exxeption находится в строке 7.android.os.NetworkOnMainThreadException в doInBackground AsyncTask

private class ImageDownloadTask extends AsyncTask<String, Integer, byte[]> { 
    @Override 
    protected byte[] doInBackground(String... params) { 
     try { 
      URL url = new URL(params[0]); 
      URLConnection connection = url.openConnection(); 
      InputStream inputStream = connection.getInputStream(); 
      ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream(); 
      int bufferSize = 1024; 
      byte[] buffer = new byte[bufferSize]; 

      int len; 
      while ((len = inputStream.read(buffer)) != -1) { 
       byteBuffer.write(buffer, 0, len); 
      } 
      return byteBuffer.toByteArray(); 
     } catch (IOException ex) { 
      return new byte[0]; 
     } 
    } 
} 

Я хочу использовать его для загрузки изображения.

public byte[] getProfilePicture(Context context, String id) { 
    String url = context.getString(R.string.facebook_picture_url_large, id); 
    ImageDownloadTask task = new ImageDownloadTask(); 
    return task.doInBackground(url); 
} 
+5

Добавьте код, где вы называете AsyncTask – ianhanniballake

+0

возможный дубликат [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – njzk2

+0

Нет дубликата, потому что все посты о те, которые не использовали асинхронную задачу, но у меня есть и все равно получаю исключение. –

ответ

14

Позвонив doInBackground() напрямую, вы на самом деле не с помощью функции AsyncTask. Вместо этого вы должны позвонить execute(), а затем использовать результаты, переопределив метод onPostExecute() AsyncTask, как описано в разделе «Использование» этой же страницы.

1

Лучший способ загрузить изображение и прикрепить его к ImageView - передать ImageView в качестве параметра в вашей асинхронной задаче и установить URL-адрес в качестве тега изображения, после загрузки задачи в OnPostExecute() установите изображение в ImageView взгляд на этом примере:

public class DownloadImagesTask extends AsyncTask<ImageView, Void, Bitmap> { 

ImageView imageView = null; 

@Override 
protected Bitmap doInBackground(ImageView... imageViews) { 
    this.imageView = imageViews[0]; 
    return download_Image((String)imageView.getTag()); 
} 

@Override 
protected void onPostExecute(Bitmap result) { 
    imageView.setImageBitmap(result); 
} 


private Bitmap download_Image(String url) { 
    ... 
} 

И Usage будет как этот

ImageView mChart = (ImageView) findViewById(R.id.imageview); 
String URL = "http://www...someImageUrl ..."; 

mChart.setTag(URL); 
new DownloadImageTask.execute(mChart); 

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

Удачи.