2017-06-20 66 views
2

我想thread.So我使用一個線程來完成這項工作,這樣來捕獲背景畫面:View的繪製方法可以在Android的後臺線程上運行嗎?

private void captureScreen(final Context context) { 
    new Thread(){ 
     @Override 
     public void run() { 
      View view = ((Activity) context).findViewById(android.R.id.content); 
      Bitmap bmp = Bitmap.createBitmap(view.getWidth(), view.getHeight(), 
        Bitmap.Config.ARGB_8888); 

      if (null != bmp) { 
       view.draw(new Canvas(bmp)); 
       stack.push(bmp);        
      } 
     } 
    }.start();  
} 

大部分時間是沒有問題的,但有時這會通過「只原來的線程崩潰引起的能觸摸這個「,所以使view.draw()運行在其他線程是正確的事情要做,或者你有更好的方法來捕獲屏幕上的後臺線程?

回答

0

問題是你不在UI線程中執行你的代碼。 Android提供了幾種方法來使用UI線程:

MainActivity.this.runOnUiThread(new Runnable() { 
    public void run() { 
     captureScreen(); 
    } 
}); 

MainActivity.this.myView.post(new Runnable() { 
    public void run() { 
     captureScreen(); 
    } 
}); 

private class BackgroundTask extends AsyncTask<String, Void, Bitmap> { 

    ....... 

    protected void onPostExecute(Bitmap result) { 
     captureScreen(result); 
    } 
} 

而且你需要重構自己captureScreen();方法不創建新的Thread()只是做屏幕截圖。

+0

無論如何,但我想在後臺線程,而不是UI線程,因此屏幕捕獲將不會採取UI線程的資源。 –

+1

不幸的是,沒有辦法更新不在UI線程中的視圖元素。您可以在後臺創建位圖,但「view.draw(new Canvas(bmp));」必須位於UI線程中。 –

相關問題