2012-06-28 22 views
0

嗨,大家好。下載大尺寸圖像時出現問題。很奇怪,從流中讀取字節時總是沒有響應。我的代碼如下,任何建議都是值得歡迎的。inputstream.read下載大圖像時無反應(大小> 300K)

public class ImageTestActivity extends Activity { 

    public static final int IMAGE_BUFFER_SIZE = 8*1024; 
    public static final int MAX_REQUEST_WIDTH = 480; 
    public static final int MAX_REQUEST_HEIGHT = 480; 
    private static final String TAG = ImageTestActivity.class.getSimpleName(); 
    private static final int HTTP_CONNECT_TIMEOUT = 10000; 

    private static final int CONTENT_IMAGE_OFFSET = 80; 
    private Display mDisplay = null; 

    private ImageView mContentPic = null; 

    private Bitmap mContentPicBitmap = null; 

    private RefreshAsyncTask mRefreshTask = null; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main);   
     mContentPic = (ImageView)findViewById(R.id.wimessage_content_picture); 
     mDisplay = getWindowManager().getDefaultDisplay(); 
     mRefreshTask = new RefreshAsyncTask(); 
     mRefreshTask.execute("http://218.240.46.38/img/201206/28/-980416187.jpeg"); 
    }  

    private void initImageSetting(Bitmap bm) { 
     if (bm == null) { 
      return; 
     } 
     int scrWidth = mDisplay.getWidth(); 
     int scrHeight = mDisplay.getHeight(); 
     int imageHeight = bm.getHeight(); 
     int imageWidth = bm.getWidth(); 
     /*if (imageHeight*3 < imageWidth*2) { 
      * It is very strange, when the picture aspect ratio less than 3:2, 
      * execute the following code will cause the picture is not displayed 
      * 
      return; 
     }*/ 

     mContentPic.setAdjustViewBounds(true); 
     mContentPic.setMaxWidth(scrWidth - CONTENT_IMAGE_OFFSET); 
     if ((imageWidth <= scrWidth - CONTENT_IMAGE_OFFSET) || (imageHeight < scrHeight)) { 
      mContentPic.setMaxHeight(imageHeight); 
     } else { 
      mContentPic.setMaxHeight((int)((float)imageHeight * (scrWidth - CONTENT_IMAGE_OFFSET)/imageWidth));  
     } 
    } 

    public static byte[] getBytes(BufferedInputStream inStream) throws IOException { 
     ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
     BufferedOutputStream out = new BufferedOutputStream(outStream, IMAGE_BUFFER_SIZE); 
     byte[] buffer = new byte[IMAGE_BUFFER_SIZE]; 

     int len = inStream.read(buffer); 
     Log.i(TAG, "---start---"); 
     while (len != -1) { 
      Log.i(TAG, ((Integer)len).toString()); 
      try { 
       out.write(buffer, 0, len); 
      } catch (IndexOutOfBoundsException e) { 
       e.printStackTrace(); 
      } 
      len = inStream.read(buffer); 
     } 

     Log.i(TAG, "---end---"); 
     out.flush(); 
     out.close(); 
     inStream.close(); 

     return outStream.toByteArray(); 
    } 

    public static int calculateInSampleSize(BitmapFactory.Options options, 
      int reqWidth, int reqHeight) { 
     // Raw height and width of image 
     final int height = options.outHeight; 
     final int width = options.outWidth; 
     int inSampleSize = 1; 

     if (height > reqHeight || width > reqWidth) { 
      if (width > height) { 
       inSampleSize = Math.round((float) height/(float) reqHeight); 
      } else { 
       inSampleSize = Math.round((float) width/(float) reqWidth); 
      } 

      // This offers some additional logic in case the image has a strange 
      // aspect ratio. For example, a panorama may have a much larger 
      // width than height. In these cases the total pixels might still 
      // end up being too large to fit comfortably in memory, so we should 
      // be more aggressive with sample down the image (=larger 
      // inSampleSize). 

      final float totalPixels = width * height; 

      // Anything more than 2x the requested pixels we'll sample down 
      // further. 
      final float totalReqPixelsCap = reqWidth * reqHeight * 2; 

      while (totalPixels/(inSampleSize * inSampleSize) > totalReqPixelsCap) { 
       inSampleSize++; 
      } 
     } 
     return inSampleSize; 
    }  

    public static Bitmap loadImageFromURL(String urlPath) { 
     try { 
      URL url = new URL(urlPath); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setRequestMethod("GET"); 
      connection.setConnectTimeout(HTTP_CONNECT_TIMEOUT); 
      int rspCode = connection.getResponseCode(); 
      if (rspCode == HttpStatus.SC_OK) { 
       //InputStream in = connection.getInputStream(); 
       Bitmap bitmap = null; 
       BufferedInputStream in = new BufferedInputStream(url.openStream(), IMAGE_BUFFER_SIZE); 
       byte[] data = getBytes(in); 
       in.close(); 
       if (data != null) { 
        try { 
         BitmapFactory.Options options = new BitmapFactory.Options(); 
         options.inJustDecodeBounds = true; 
         options.inSampleSize = calculateInSampleSize(options, MAX_REQUEST_WIDTH, MAX_REQUEST_HEIGHT); 
         options.inJustDecodeBounds = false; 
         bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, options); 
        } catch (OutOfMemoryError e) { 
         e.printStackTrace(); 
        } 
       } else { 
        Log.i(TAG, "data == null"); 
       } 

       connection.disconnect();     
       return bitmap; 
      } else { 
       connection.disconnect(); 
       Log.i(TAG, "rspCode = " + rspCode); 
      } 
     } catch (MalformedURLException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    private class RefreshAsyncTask extends AsyncTask<String, Boolean, Boolean> { 
     @Override 
     protected Boolean doInBackground(String... arg0) { 
      mContentPicBitmap = loadImageFromURL(arg0[0]); 
      return true; 
     } 

     @Override 
     protected void onPostExecute(Boolean result) { 
      super.onPostExecute(result); 
      if (mContentPicBitmap != null) { 
       initImageSetting(mContentPicBitmap); 
       mContentPic.setImageBitmap(mContentPicBitmap); 
      } 
     } 
    }  
} 
+0

logcat的信息給出如下: 06-28 16:22:24.185:I/ImageTestActivity(6648):--- start --- 06-28 16:22:24.185:I/ImageTestActivity(6648):2645 06-28 16:22:24.193:I/ImageTestActivity(6648):5792 – breeze

+0

同時在仿真器上執行相同的操作,它工作正常,沒有問題。 – breeze

+0

所以它適用於小尺寸圖像? – Caner

回答

0

試試這個我有UR鏈接嘗試給我看在imageview的

BitmapFactory.Options bmOptions; 
bmOptions = new BitmapFactory.Options(); 
bmOptions.inSampleSize = 1; 
bm = LoadImage("http://218.240.46.38/img/201206/28/-980416187.jpeg", bmOptions); 
imageview.setImageBitmap(bm); 

的圖像,其中methos 的LoadImage低於

private Bitmap LoadImage(String URL, BitmapFactory.Options options){  
    Bitmap bitmap = null; 
    InputStream in = null;  
    try { 
     in = OpenHttpConnection(URL); 
     bitmap = BitmapFactory.decodeStream(in, null, options); 
     in.close(); 
    } catch (IOException e1) { 

    } 
    return bitmap;    
} 


private InputStream OpenHttpConnection(String strURL) throws IOException { 
    InputStream inputStream = null; 
    URL url = new URL(strURL); 
    URLConnection conn = url.openConnection(); 

    try{ 
     HttpURLConnection httpConn = (HttpURLConnection)conn; 
     httpConn.setRequestMethod("GET"); 
     httpConn.connect(); 
     if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) { 
      inputStream = httpConn.getInputStream(); 
     } 
    } catch (Exception ex){ 

    } 
    return inputStream; 
} 
+0

你在模擬器或目標上試試這個嗎 – breeze

+0

是上面的代碼在imageview中顯示我的圖像,如果你需要我的模擬器捕捉比我還粘貼在這裏 – Khan

+0

我已經試過你的代碼,除了target.thanks之外,它在仿真器上運行良好 – breeze

0

更新:

使用connection.getInputStream()更換url.openStream()

BufferedInputStream in = new BufferedInputStream(connection.getInputStream(), IMAGE_BUFFER_SIZE); 

和你getBytes方法試試這個:

public static byte[] getBytes(BufferedInputStream inStream) throws IOException { 
    ByteArrayOutputStream out = new ByteArrayOutputStream(IMAGE_BUFFER_SIZE); 
    byte[] buffer = new byte[IMAGE_BUFFER_SIZE]; 

    int len = 0; 
    Log.i(TAG, "---start---"); 
    while ((len = inStream.read(buffer)) != -1) { 
     out.write(buffer, 0, len); 
     Log.i(TAG, "readed:" + len); 
    } 
    Log.i(TAG, "---end---"); 
    out.flush(); 
    inStream.close(); 

    return out.toByteArray(); 
} 

和最後不要忘記添加權限:

<uses-permission android:name="android.permission.INTERNET"/> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> 
+0

我會在稍後嘗試,謝謝 – breeze

+0

問題仍然存在。 06-28 17:16:16.009:I/ImageTestActivity(7175):--- start --- 06-28 17:16:16.013:I/ImageTestActivity(7175):read:245 – breeze

+0

嘗試'connection.getInputStream )'replace'url.openStream()' – idiottiger