2017-06-20 35 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线程中。 –

相关问题