Android 获取工作线程中滚动视图的屏幕截图

Android 获取工作线程中滚动视图的屏幕截图,android,multithreading,screenshot,android-scrollview,Android,Multithreading,Screenshot,Android Scrollview,我需要一个ScrollView的屏幕截图。我的代码如下: private File getScreenShot() { final int count = mScrollView.getChildCount(); int height = 0; for (int i = 0; i < count; i++) { View view = mScrollView.getChildAt(i); height += view.getHeigh

我需要一个ScrollView的屏幕截图。我的代码如下:

private File getScreenShot() {
    final int count = mScrollView.getChildCount();
    int height = 0;
    for (int i = 0; i < count; i++) {
        View view = mScrollView.getChildAt(i);
        height += view.getHeight();
    }

    // get screen shot bitmap
    Bitmap bitmap = Bitmap.createBitmap(mScrollView.getWidth(), height,
            Bitmap.Config.RGB_565);
    final Canvas canvas = new Canvas(bitmap);
    mScrollView.draw(canvas);

    // save to a temp file
    return saveToFile(bitmap);
}
但有趣的是:我尝试使用
Thread
AsyncTask
的子类。他们每个人都能在大部分时间内完成这项工作。但是,过几次会引发异常并导致应用程序崩溃:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
但是如何在大多数时间内成功运行代码?我的意思是,如果我能得到这个异常,我确实做了一些错误的事情(调用
View.draw(Canvas)
在主线程之外)。第一次或第二次运行代码时不会发生故障,而第三次可能会发生故障。我试图滚动
ScrollView
并在滚动停止之前调用该方法,这可能会导致崩溃。但如果我第一次做同样的事情,崩溃也不会发生

我输出线程,它属于主组->[线程XXXXX,5,主]


我不知道为什么会出现这种奇怪的结果?有人能告诉我原因吗?如何在另一个线程中获取
滚动视图的屏幕截图?

我不会尝试从另一个线程获取屏幕截图。我会从主线程获取屏幕截图,并将其保存到另一个线程的磁盘上

您是否尝试过图形缓存

mScrollView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(mScrollView.getDrawingCache());
mScrollView.setDrawingCacheEnabled(false);

如果它不能提高性能,我会截取mScrollView子线程的屏幕快照,并将它们组装到另一个线程上的一个位图中。它将允许您在子级之间生成UI线程。

绘图缓存是无用的,它将为scrollview创建一个空位图。对不起,您是对的。还刚刚验证了一个旧项目,canvas也是我这样做的。没有任何问题,所以我假设您的屏幕上加载了视图:)。我还是喜欢孩子们而不是滚动视图
mScrollView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(mScrollView.getDrawingCache());
mScrollView.setDrawingCacheEnabled(false);