Android线程无法访问Main.xml

时间:2011-11-14 16:51:14

标签: android multithreading nullpointerexception android-camera

我正在尝试使用线程连续拍照。问题是我在尝试创建预览时遇到空指针异常。

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");
}

1 个答案:

答案 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上调用方法。我提供的链接提供了一些方法。如果您在发布代码或新问题时仍然遇到问题。