在安卓系统中,View的draw方法能够在后台线程上运行吗?

3

我希望能在后台线程上截取屏幕。因此,我使用一个线程来完成这项工作,就像这样:

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()是正确的做法,或者您有更好的方法来在后台线程上捕获屏幕吗?

1个回答

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();方法,不要创建新的线程(),只需截屏即可。


谢谢你的帮助,但我想在后台线程中完成它,而不是在UI线程中。这样屏幕截图就不会占用UI线程的资源了。 - Jishi Chen
1
很遗憾,在UI线程之外,没有办法更新视图元素。你可以在后台创建位图,但是 "view.draw(new Canvas(bmp));" 必须在UI线程中执行。 - Oleg Sokolov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接