我正在TextureView
中显示TextureView
,并使用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();
}
});
这是我的日志
08-22 03:59:57.867: E/AndroidRuntime(4859): FATAL EXCEPTION: main
08-22 03:59:57.867: E/AndroidRuntime(4859): java.lang.NullPointerException
08-22 03:59:57.867: E/AndroidRuntime(4859): at com.example.hangout_gif_camera.MainActivity$1.onClick(MainActivity.java:41)
08-22 03:59:57.867: E/AndroidRuntime(4859): at android.view.View.performClick(View.java:4211)
08-22 03:59:57.867: E/AndroidRuntime(4859): at android.view.View$PerformClick.run(View.java:17446)
08-22 03:59:57.867: E/AndroidRuntime(4859): at android.os.Handler.handleCallback(Handler.java:725)
08-22 03:59:57.867: E/AndroidRuntime(4859): at android.os.Handler.dispatchMessage(Handler.java:92)
08-22 03:59:57.867: E/AndroidRuntime(4859): at android.os.Looper.loop(Looper.java:153)
08-22 03:59:57.867: E/AndroidRuntime(4859): at android.app.ActivityThread.main(ActivityThread.java:5297)
08-22 03:59:57.867: E/AndroidRuntime(4859): at java.lang.reflect.Method.invokeNative(Native Method)
08-22 03:59:57.867: E/AndroidRuntime(4859): at java.lang.reflect.Method.invoke(Method.java:511)
08-22 03:59:57.867: E/AndroidRuntime(4859): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833)
08-22 03:59:57.867: E/AndroidRuntime(4859): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
08-22 03:59:57.867: E/AndroidRuntime(4859): at dalvik.system.NativeStart.main(Native Method)
发布于 2014-08-22 02:54:08
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
}
});
发布于 2015-03-06 21:38:33
您必须在主UI线程上触发TextureView.getBitmap()
。然后将这个Bitmap
传递给一个AsyncTask
,然后在那里执行剩下的操作。我就是这么做的,而且效果很好。
如果您正在捕获TextureView
的每一个帧,例如从MediaRecorder
中捕获,请注意内存问题。
https://stackoverflow.com/questions/25438814
复制相似问题