Android 当视图更改时,从AsyncTask访问视图失败

Android 当视图更改时,从AsyncTask访问视图失败,android,android-asynctask,Android,Android Asynctask,我正在构建一个模块,用于在用户使用应用程序时捕获applicationrootview的屏幕截图。我基本上是在尝试创建应用程序使用情况的视频记录。我决定从AsyncTask中截图,因为截图时无法阻止主线程。这是我到目前为止的代码 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.act

我正在构建一个模块,用于在用户使用应用程序时捕获applicationrootview的屏幕截图。我基本上是在尝试创建应用程序使用情况的视频记录。我决定从AsyncTask中截图,因为截图时无法阻止主线程。这是我到目前为止的代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);
    Button record = (Button) findViewById(R.id.record);

    final View content = findViewById(R.id.record).getRootView();
    content.setDrawingCacheEnabled(true);       
    record.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            mtask = (CaptureSnap) new CaptureSnap(content,getApplicationContext()).execute();
        }
    });

}
在AsyncTask中编写代码以获取屏幕截图

private Bitmap getScreen(int index){
    View content = view.findViewById(R.id.record).getRootView();
    try{
    if(content != null){
        Log.i(TAG, "taking screenshot "+index);
        Bitmap bitmap = content.getDrawingCache();
        return bitmap;
    }else
        return null;
    }catch(NullPointerException e){
        Log.e(TAG, "Error for screenshot "+index);
        return null;
    }
}

@Override
protected String doInBackground(String... arg0) {
    while(indicator == 0){
        try{
            Bitmap screenshot = getScreen(0);
            Thread.sleep(100);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}
除非我在截图时尝试使用该应用程序,否则该代码工作正常。我得到下面的错误

    06-18 13:44:26.132: W/System.err(14096): android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
06-18 13:44:26.164: W/System.err(14096):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4888)
06-18 13:44:26.164: W/System.err(14096):    at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:975)
06-18 13:44:26.164: W/System.err(14096):    at android.view.ViewGroup.invalidateChild(ViewGroup.java:4125)
06-18 13:44:26.171: W/System.err(14096):    at android.view.View.invalidate(View.java:10578)
06-18 13:44:26.171: W/System.err(14096):    at android.view.View.invalidate(View.java:10533)
06-18 13:44:26.171: W/System.err(14096):    at android.widget.AbsListView.draw(AbsListView.java:4261)
06-18 13:44:26.171: W/System.err(14096):    at android.view.View.draw(View.java:13710)
06-18 13:44:26.171: W/System.err(14096):    at android.view.ViewGroup.drawChild(ViewGroup.java:2988)
06-18 13:44:26.171: W/System.err(14096):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2858)
06-18 13:44:26.171: W/System.err(14096):    at android.view.View.draw(View.java:13708)
06-18 13:44:26.171: W/System.err(14096):    at android.view.ViewGroup.drawChild(ViewGroup.java:2988)
06-18 13:44:26.171: W/System.err(14096):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2858)
06-18 13:44:26.171: W/System.err(14096):    at android.view.View.draw(View.java:13829)
06-18 13:44:26.171: W/System.err(14096):    at android.widget.FrameLayout.draw(FrameLayout.java:467)
06-18 13:44:26.171: W/System.err(14096):    at android.view.View.draw(View.java:13710)
06-18 13:44:26.171: W/System.err(14096):    at android.view.ViewGroup.drawChild(ViewGroup.java:2988)
06-18 13:44:26.171: W/System.err(14096):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2858)
06-18 13:44:26.171: W/System.err(14096):    at android.view.View.draw(View.java:13708)
06-18 13:44:26.171: W/System.err(14096):    at android.view.ViewGroup.drawChild(ViewGroup.java:2988)
06-18 13:44:26.171: W/System.err(14096):    at android.view.ViewGroup.dispatchDraw(ViewGroup.java:2858)
06-18 13:44:26.179: W/System.err(14096):    at android.view.View.draw(View.java:13829)
06-18 13:44:26.179: W/System.err(14096):    at android.widget.FrameLayout.draw(FrameLayout.java:467)
06-18 13:44:26.179: W/System.err(14096):    at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:2458)
06-18 13:44:26.187: W/System.err(14096):    at android.view.View.buildDrawingCache(View.java:13087)
06-18 13:44:26.187: W/System.err(14096):    at android.view.View.getDrawingCache(View.java:12875)
06-18 13:44:26.187: W/System.err(14096):    at android.view.View.getDrawingCache(View.java:12840)
06-18 13:44:26.187: W/System.err(14096):    at com.example.recordit.CaptureSnap.getScreen(CaptureSnap.java:158)

有人能帮我吗?

您需要从UI线程调用它,使用处理程序将结果发回,以便UI线程可以在那里运行它。

当我将AsyncTask替换为时,我的问题就解决了。我在Acitivity中创建了一个脚本,它将消息发布到处理程序,处理程序将截图并将其序列化到一个文件中。稍后,我使用这些文件使用JCodec将它们编码到视频录制中。感谢您的帮助。

您只能从主线程访问视图。doInBackground正在后台线程中运行。。。