【问题标题】:Android thread cannot access Main.xmlAndroid 线程无法访问 Main.xml
【发布时间】:2011-11-14 16:51:13
【问题描述】:

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

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

【问题讨论】:

    标签: android multithreading nullpointerexception android-camera


    【解决方案1】:

    您在 ImageView 中调用 setContentView 对我来说没有意义,因为我在 documentation 中找不到这样的方法。此外,图像是一个视图,而不是视图组,因此像您这样在其中包含其他视图是没有意义的。

    如果我猜的话,我会推荐一个 CameraActivity 类,它扩展了 Activity。在该活动的onCreate 方法中,您可以像在此处那样设置内容视图。您也可能会为您的 CameraActivity 使用不同的 XML 文件,您可以在其中定义要显示的 ImageView。

    你能解释一下你想要做什么吗?

    我建议您开始查看 android 开发者网站。有大量关于如何开始的重要信息

    编辑:

    这里是android上线程的介绍:http://developer.android.com/resources/articles/painless-threading.html

    AsyncTask 在 ThreadPool 中运行,因此您没有理由不能在那里进行图像处理。它基本上是一个具有很好的特性的线程,例如可以轻松地与 UI 线程通信。

    您收到该错误消息的原因是您在 UI 线程之外的 View 上调用方法。我提供的链接提供了一些解决方法。如果您仍然遇到问题,请发布您的代码或提出新问题。

    【讨论】:

    • 我在View 中也没有看到setContentView。是在以前的 API 级别吗?
    • 我设法使用 AsyncTask 实现了这种工作,但我宁愿使用线程,因为我以后想实现一些图像处理。我只是对线程不太熟悉。当我在活动中实现了大部分方法时,我会收到一个错误,即线程无法修改它未创建的视图,这就是我尝试在线程中实现大部分方法的原因。
    • 我已经用更多信息更新了我的答案。你不应该害怕使用 AsyncTask。您收到该错误的原因是您尝试在 UI 线程之外修改 View。
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-03-31
    • 1970-01-01
    • 2014-08-25
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多