获取工作线程

时间:2016-04-06 02:03:47

标签: 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.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);
}

因为我的mScrollView太长了以至于某些内容将被隐藏,直到用户向下滚动,它会花费很多时间捕获屏幕截图(接近100毫秒)并暂时停止UI线程。所以我决定在另一个线程中运行该方法。代码喜欢:

new Thread() {
    @Override
    public void run() {
        System.out.println(Thread.currentThread());
        mShareFile = getScreenShot();
        mHandler.sendEmptyMessage(96);
    }
}.start();

但有趣的是:我尝试使用ThreadAsyncTask的子类。他们每个人都可以在大多数时间里完成这项工作。但是,有几次会抛出异常并导致应用程序崩溃:

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

但是我怎样才能在大多数时间内成功运行代码?我的意思是,如果我能得到这个例外,我确实做错了什么(在主线程之外调用View.draw(Canvas))。第一次或第二次运行代码时,失败不会发生,而第三次可能会发生。我试图滚动ScrollView并在滚动停止之前调用方法,这可能会导致崩溃。但如果我第一次做同样的事情,碰撞也不会发生。

我输出线程,它属于主要组 - &gt; [主题XXXXX,5,主要]

我不知道为什么会发生这种奇怪的结果?有人可以告诉我原因吗?如何在另一个帖子中获取ScrollView的屏幕截图?

1 个答案:

答案 0 :(得分:0)

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

您是否尝试过绘图缓存?

@JsonIgnoreProperties({ "createdDate", "lastModifiedDate" })

如果它没有提高性能,我会截取mScrollView子代的截图,并将它们组装成另一个线程上的一个位图。它允许你在子节点之间产生UI线程。