2014-10-06 20 views
6

Neden bir Android.os.NetworkOnMainThreadException olmalıdır bir AsyncTask alıyorum? AsyncTask'ın bu sorunun çözümü olduğunu düşündüm. Ekspresyon 7 satırındadır.android.os.NetworkOnMainThreadException

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]; 
     } 
    } 
} 

Resim indirmek için kullanmak istiyorum. doğrudan, aslında AsyncTask işlevselliği kullanmıyorsanız doInBackground() arayarak

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

Eğer AsyncTask – ianhanniballake

+0

olası yinelenen çağrı kodu ekleyin [android.os.NetworkOnMainThreadException] (http://stackoverflow.com/questions/6343166/android-os-networkonmainthreadexception) – njzk2

+0

Hiçbir yinelenen, bütün yayınlar, çünkü yaklaşık async görevini kullanmayan ama yine de istisnasız olanları alıyorum. –

cevap

14

. Bunun yerine, execute() numaralı telefonu aramalı ve sonuçları, aynı sayfanın Kullanım bölümünde açıklandığı gibi AsyncTask'in onPostExecute() yöntemini geçersiz kılarak kullanmalısınız.

1

ardından resmi olarak ayarlanmış OnPostExecute() görevi indirdikten sonra görüntü görünümünde bir etiket olarak URL'yi bir görüntü indirmek ve zaman uyumsuz görev parametre olarak ImageView geçtiği bir ImageView ekleyin ve ayarlamak için en iyi yolu Bu örneğe ImageView bakmak:

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) { 
    ... 
} 

Ve Kullanımı Eğer WeakReference kullanabilirsiniz daha fazla bellek optimizasyonu için, bittiğinde görüntü otomatik olarak eklenecek bu

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

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

gibi olacak.

İyi Şanslar.