2014-12-27 98 views
2

我試圖捕獲webview,但是當我試圖壓縮位圖webview凍結。我嘗試了很多,但沒有找到解決方案。請幫助..Webview在Android中凍結

下面是一些代碼:

 webview.getHeight(); 
     Picture p = webview.capturePicture(); 
     webview.setDrawingCacheEnabled(true);   
     Bitmap bitmap = pictureDrawable2Bitmap(p); 
     webview.setDrawingCacheEnabled(false); 

     String fname = System.currentTimeMillis() + ".png"; 
     File file1 = new File(fname); 
     try 
     { 
      FileOutputStream out = new FileOutputStream(file1); 
      bitmap.compress(Bitmap.CompressFormat.PNG, 10, out); 
      out.flush(); 
      out.close(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 


private static Bitmap pictureDrawable2Bitmap(Picture picture) 
{ 
    PictureDrawable pictureDrawable = new PictureDrawable(picture); 
       Bitmap bitmap = null; 
     try 
     { 
      bitmap = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(),pictureDrawable.getIntrinsicHeight(), Config.ARGB_8888); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 
     Canvas canvas = new Canvas(bitmap); 
     canvas.drawPicture(pictureDrawable.getPicture()); 
     return bitmap; 
} 

回答

0

按照建議所有磁盤和網絡操作應關閉主線程 對於這一點,我們爲您提供的ThreadAsyncTaskLoader班,我看到你正在與主線程Bitmap工作,這是不建議做的資源量需要這就是爲什麼我們必須做這個過程的主線程。

Android Developer documentation上有一個詳細的例子,說明如何使用上面提到的類來實現這個功能,這裏是一個例子,需要一個Bitmap來加載線程(這是你試圖做的一件事) :

class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> { 
    private final WeakReference<ImageView> imageViewReference; 
    private int data = 0; 

    public BitmapWorkerTask(ImageView imageView) { 
     // Use a WeakReference to ensure the ImageView can be garbage collected 
     imageViewReference = new WeakReference<ImageView>(imageView); 
    } 

    // Decode image in background. 
    @Override 
    protected Bitmap doInBackground(Integer... params) { 
     data = params[0]; 
     return decodeSampledBitmapFromResource(getResources(), data, 100, 100)); 
    } 

    // Once complete, see if ImageView is still around and set bitmap. 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     if (imageViewReference != null && bitmap != null) { 
      final ImageView imageView = imageViewReference.get(); 
      if (imageView != null) { 
       imageView.setImageBitmap(bitmap); 
      } 
     } 
    } 
} 

這裏是調用和加載位圖的方法。

public void loadBitmap(int resId, ImageView imageView) { 
    BitmapWorkerTask task = new BitmapWorkerTask(imageView); 
    task.execute(resId); 
} 

正如您上面的一個小技巧看到了網絡或磁盤的操作工作,但話又說回來了Android Documentation充滿例子來解決這個問題。

希望你能解決你的問題。