Java TextureView:在后台执行TextureView.getBitmap()

Java TextureView:在后台执行TextureView.getBitmap(),java,android,bitmap,camera,textureview,Java,Android,Bitmap,Camera,Textureview,我正在TextureView中显示CameraView,并使用TextureView.getBitmap()从TextureView获取位图 每次调用TextureView.getBitmap()时,它都会导致相机预览冻结一纳秒。我想在后台运行此任务 谢谢 以下是我尝试过的代码: findViewById(R.id.capture).setOnClickListener(new OnClickListener() { @Override pu

我正在
TextureView
中显示
CameraView
,并使用
TextureView.getBitmap()
TextureView
获取位图

每次调用
TextureView.getBitmap()
时,它都会导致相机预览冻结一纳秒。我想在后台运行此任务

谢谢

以下是我尝试过的代码:

     findViewById(R.id.capture).setOnClickListener(new OnClickListener() {
           @Override
           public void onClick(View v) {
             Bitmap bmp =  mTextureView.getBitmap();  
             rev = new ArrayList<Bitmap>();
             rev.add(bmp);
             Toast.makeText(getApplicationContext(),""+ rev.size(), Toast.LENGTH_LONG).show();
           }
        });     
你甚至不会意识到它冻结了我们的眼睛,我们的反应不会那么快(除非你是超人)

但如果您确实希望它在单独的线程中运行,可以尝试以下方法:

编辑:

findViewById(R.id.capture).setOnClickListener(new OnClickListener() {
               @Override
               public void onClick(View v) {
                 Thread td = new Thread(new Runnable() {
                   public void run()
                   {
                         Bitmap bmp =  mTextureView.getBitmap();  
                         rev = new ArrayList<Bitmap>();
                         rev.add(bmp);
                         runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                 Toast.makeText(getApplicationContext(),""+ rev.size(), Toast.LENGTH_LONG).show();
                            }
                        });
                   }
                 });
                 td.start(); //start the thread

               }
            }); 
findviewbyd(R.id.capture).setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
Thread td=新线程(new Runnable(){
公开募捐
{
位图bmp=mTextureView.getBitmap();
rev=新的ArrayList();
修订增补(bmp);
runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
Toast.makeText(getApplicationContext(),“”+rev.size(),Toast.LENGTH\u LONG.show();
}
});
}
});
td.start();//启动线程
}
}); 

您必须在主UI线程上的上启动
TextureView.getBitmap()
。然后将该
位图
传递给
异步任务
并在那里执行其余操作。我就是这样做的,效果很好


如果要捕获
TextureView
的每一帧,请注意内存问题,例如,从
MediaRecorder

它会导致我的应用程序crash@DonnieIbiyemi你能把我刚贴的logcatRod_Algonquin贴出来吗it@DonnieIbiyemi第41行是什么?Rod_Algonquin Toast消息我发现在Galaxy S5上获得1920x1080位图大约需要50毫秒,这对于UI线程来说相当重要。在一半大小时,大约需要15毫秒,四分之一大小大约需要5毫秒。因此,这个解决方案是可行的(并且可能是唯一的选择),但我仍然认为它的性能不是很好/
 freeze for a nano second
findViewById(R.id.capture).setOnClickListener(new OnClickListener() {
               @Override
               public void onClick(View v) {
                 Thread td = new Thread(new Runnable() {
                   public void run()
                   {
                         Bitmap bmp =  mTextureView.getBitmap();  
                         rev = new ArrayList<Bitmap>();
                         rev.add(bmp);
                         runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                 Toast.makeText(getApplicationContext(),""+ rev.size(), Toast.LENGTH_LONG).show();
                            }
                        });
                   }
                 });
                 td.start(); //start the thread

               }
            });