2011-01-01 11 views
8

以下のコードを使用してURLから画像を取得しましたが、大きな画像では機能しません。URLから大きな画像を取得するにはどうすればよいですか?

このタイプのイメージを取得するときに何か不足していますか?あなたが....これはANR(アプリケーションが応答しない)

使用AsyncTask画像をダウンロードするには、そのように発生しますUIスレッド内から大画像をダウンロードしようとしている

imgView = (ImageView)findViewById(R.id.ImageView01); 
    imgView.setImageBitmap(loadBitmap("http://www.360technosoft.com/mx4.jpg")); 

    //imgView.setImageBitmap(loadBitmap("http://sugardaddydiaries.com/wp-content/uploads/2010/12/how_do_i_get_sugar_daddy.jpg")); 
    //setImageDrawable("http://sugardaddydiaries.com/wp-content/uploads/2010/12/holding-money-copy.jpg"); 
    //Drawable drawable = LoadImageFromWebOperations("http://www.androidpeople.com/wp-content/uploads/2010/03/android.png"); 
    //imgView.setImageDrawable(drawable); 

/* try { 
    ImageView i = (ImageView)findViewById(R.id.ImageView01); 
    Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL("http://sugardaddydiaries.com/wp-content/uploads/2010/12/holding-money-copy.jpg").getContent()); 
    i.setImageBitmap(bitmap); 
    } catch (MalformedURLException e) { 
    System.out.println("hello"); 
    } catch (IOException e) { 
    System.out.println("hello"); 
    }*/ 
    } 


protected Drawable ImageOperations(Context context, String string, 
    String string2) { 
    // TODO Auto-generated method stub 
    try { 
    InputStream is = (InputStream) this.fetch(string); 
    Drawable d = Drawable.createFromStream(is, "src"); 
    return d; 
    } catch (MalformedURLException e) { 
    e.printStackTrace(); 
    return null; 
    } catch (IOException e) { 
    e.printStackTrace(); 
    return null; 
    } 

} 
+0

私は 'loadBitmap'がファイルを簡単にダウンロードしていると確信しています...スレッドを使わずに、そうですか? – st0le

答えて

5

、別のスレッドがダウンロードに使用され、UIスレッドはロックされません。

+0

st0leが正しいです。 AsyncTaskを使用してください。たとえば:http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – RyanM

0
 public class MyImageActivity extends Activity 
    { 
     private String image_URL= "http://home.austarnet.com.au/~caroline/Slideshows/Butterfly_Bitmap_Download/slbutfly.bmp"; 

     private ProgressDialog pd; 
     private Bitmap bitmap; 
     private ImageView bmImage; 
     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
       super.onCreate(savedInstanceState); 
       setContentView(R.layout.main); 

       bmImage = (ImageView)findViewById(R.id.imageview); 
       pd = ProgressDialog.show(this, "Please Wait", "Downloading Image"); 
       DownloadWebPageTask task = new DownloadWebPageTask(); 
       task.execute(new String[] { image_URL }); 
       // You can also give more images in string array 

     } 
     private class DownloadWebPageTask extends AsyncTask<String, Void, Bitmap> 
     { 
      // String --> parameter in execute 
      // Bitmap --> return type of doInBackground and parameter of onPostExecute 
      @Override 
      protected Bitmap doInBackground(String...urls) { 
       String response = ""; 
       for (String url : urls) 
       { 
        InputStream i = null; 
        BufferedInputStream bis = null; 
        ByteArrayOutputStream out =null; 

//    Only for Drawable Image   
//    try 
//    { 
//     URL url = new URL(image_URL); 
//     InputStream is = url.openStream(); 
//     Drawable d = Drawable.createFromStream(is, "kk.jpg"); 
//     bmImage.setImageDrawable(d); 
//    } 
//   catch (Exception e) { 
//    // TODO: handle exception 
//   } 

// THE ABOVE CODE IN COMMENTS WILL NOT WORK FOR BITMAP IMAGE      

try 
        { 
         URL m = new URL(image_URL); 
         i = (InputStream) m.getContent(); 
         bis = new BufferedInputStream(i, 1024*8); 
         out = new ByteArrayOutputStream(); 
         int len=0; 
         byte[] buffer = new byte[4096]; 
         while((len = bis.read(buffer)) != -1) 
         { 
          out.write(buffer, 0, len); 
         } 
         out.close(); 
         bis.close(); 

        byte[] data = out.toByteArray(); 
        bitmap = BitmapFactory.decodeByteArray(data, 0, data.length); 
        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 
        } 

       return bitmap; 
      } 

      @Override 
      protected void onPostExecute(Bitmap result) 
      { 
       if(result!=null) 
       bmImage.setImageBitmap(result); 
       pd.dismiss(); 
      } 
     } 
    } 
2

あなたは非常に迅速に画像をダウンロードしたい場合は、あなただけのandroid-query.0.15.7.jar

のインポートjarファイルをダウンロードして、次のスニペット

を追加jQueryの に似てAQueryを使用することができます
AQuery aq = new AQuery(this); 
aq.id(R.id.image).image("http://4.bp.blogspot.com/_Q95xppgGoeo/TJzGNaeO8zI/AAAAAAAAADE/kez1bBRmQTk/s1600/Sri-Ram.jpg"); 

// Here R.id.image is id of your ImageView 
// This method will not give any exception 
// Dont forgot to add Internet Permission 
+0

非同期でのみ使用する場合でも、AQueryは優れていますイメージはチェックアウトする価値がある。 – scottyab

関連する問題