我正在尝试使用线程连续拍照。问题是我在尝试创建预览时遇到空指针异常。
private class CameraThread extends ImageView implements Runnable
{
...
public CameraThread(Context c)
{
super(c);
setContentView(R.layout.main);
setFocusable(true);
p = new Preview(c);
Log.d(TAG,"preview null:"+(p==null));
s = new SurfaceView(c);
counter = 0;
if(findViewById(R.id.preview)==null)
Log.d(TAG,"preview view is null");
((FrameLayout) findViewById(R.id.preview)).addView(p);
canvas = new Canvas();
t = new TextView(c);
captureButton = (Button) findViewById(R.id.captureButton);
captureButton.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
running = true;
//new CaptureTask().execute();
}
});
clearButton = (Button) findViewById(R.id.clearButton);
clearButton.setOnClickListener(new OnClickListener()
{
public void onClick(View v)
{
running = false;
}
});
}
调试器指向我这一行:
((FrameLayout) findViewById(R.id.preview)).addView(p);
我不确定为什么这是空的。这段代码在主要活动中都运行良好。 Preview对象不会显示为null,但findViewById返回null对象。
有什么想法吗?
修改
线程在主活动中声明。我正在修改此代码,这最初是使用按钮捕获单个图片实现的。我想继续拍照。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mCameraThread = new CameraThread(this);
setContentView(mCameraThread);
Thread thread = new Thread(mCameraThread);
thread.start();
Log.d(TAG,"onCreate done");
}
答案 0 :(得分:1)
我在ImageView中调用setContentView
没有意义,因为我在documentation中找不到这样的方法。此外,图像是视图,而不是ViewGroup,因此在其中包含其他视图是没有意义的。
如果我猜我会推荐一个CameraActivity类,它扩展了Activity。在该活动的onCreate
方法中,您可以像在此处一样设置内容视图。您可能还会为CameraActivity使用不同的XML文件,您可以在其中定义要显示的ImageView。
你能解释一下你想要做什么吗?
我建议你开始检查android开发者网站。有很多关于如何开始的重要信息
编辑:
以下是对android:http://developer.android.com/resources/articles/painless-threading.html
的线程介绍AsyncTask在ThreadPool中运行,因此没有理由不能在那里进行图像处理。它基本上是一个具有很好功能的线程,例如与UI线程轻松通信。
您收到该错误消息的原因是您正在UI线程之外的View上调用方法。我提供的链接提供了一些方法。如果您在发布代码或新问题时仍然遇到问题。