2017-05-09 39 views
0

這裏我試圖將我的圖像url轉換爲位圖,以便我可以在網格視圖中顯示。 log.d部分工作正常,我成功地以字符串格式ady獲得圖像url,但是當涉及到decodestream部分時,它發生錯誤。將字符串url轉換爲位圖與解碼流

public class StringtoBitmap extends AsyncTask<String, String, Bitmap> { 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onPostExecute(Bitmap s) { 
     super.onPostExecute(s); 
    } 

    @Override 
    protected Bitmap doInBackground(String... params) { 
     try { 
      String src = params[0]; 
      Log.d("SRC", src); 
      URL url = new URL(src); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      input.reset(); 
      return myBitmap; 

     } catch (Exception e) { 
      System.out.println(e); 
      return null; 
     } 
    } 
    public void StringtoBitmap(String img) { 
     new StringtoBitmap().execute(img); 
    } 
} 

Android的監測結果的某些部分:

05-09 02:56:21.408 11585-11671/com.comma.androidapp1 E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 
                     Process: com.comma.androidapp1, PID: 11585 
                     java.lang.RuntimeException: An error occured while executing doInBackground() 
                      at android.os.AsyncTask$3.done(AsyncTask.java:300) 
                      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
                      at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
                      at java.lang.Thread.run(Thread.java:841) 
                     Caused by: java.lang.OutOfMemoryError 
                      at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
                      at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:613) 
                      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:589) 
                      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:627) 
                      at com.comma.androidapp1.StringtoBitmap.doInBackground(StringtoBitmap.java:39) 
                      at com.comma.androidapp1.StringtoBitmap.doInBackground(StringtoBitmap.java:17) 
                      at android.os.AsyncTask$2.call(AsyncTask.java:288) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)  
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)  
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)  
                      at java.lang.Thread.run(Thread.java:841)  


                     [ 05-09 02:56:21.418 1556: 1711 D/   ] 


    HostConnection::get() New Host Connection established 0xb86734b0, tid 1711 
+1

http://stackoverflow.com/ q uestions/18385362 /高分辨率圖片outofmemoryerror –

+1

https://developer.android.com/topic/performance/graphics/load-bitmap.html –

回答

0

你得到內存不足的錯誤,你的位圖的尺寸是大的,把下面的代碼來解決內存不足的錯誤

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = 2; 
Bitmap preview_bitmap = BitmapFactory.decodeStream(is, null, options); 
+0

謝謝你,你的代碼只是完美的工作 –

+0

@zhanweiyap歡迎你親愛的 –

0

對於所有圖像操作(解碼,調整大小,下載等),最好使用像GlidePicasso這樣的庫:

替換本地文件夾路徑或服務器URL

依賴路徑:

compile 'com.github.bumptech.glide:glide:3.5.2' 

代碼

Glide.with (context).load (path).into(imageView); 

Using Glide to load bitmap into ImageView