Android-поток не может получить доступ к Main.xml - PullRequest
2 голосов
/ 14 ноября 2011

Я пытаюсь использовать тему, чтобы непрерывно фотографировать.Проблема в том, что я получаю исключение нулевого указателя при попытке создать предварительный просмотр.

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 возвращает нулевой объект.

Есть мысли?

EDIT

Поток объявлен в основном действии.Я изменяю этот код, он изначально был реализован с помощью кнопок для захвата отдельных изображений.Я пытаюсь непрерывно фотографировать.

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 Ответ

1 голос
/ 14 ноября 2011

Мне не имеет смысла, что вы вызываете setContentView в ImageView, так как я не могу найти такой метод в документации .Кроме того, изображение - это View, а не ViewGroup, поэтому нет смысла иметь внутри него другие виды, как вы делаете.

Если бы я догадался, я бы порекомендовал иметь класс CameraActivity, которыйРасширяет активность.В методе onCreate этого действия вы устанавливаете представление контента так же, как здесь.Возможно, вы также использовали бы другой XML-файл для вашей CameraActivity, в котором вы определяете ImageView для отображения.

Не могли бы вы объяснить немного больше о том, что вы пытаетесь сделать?

IПредлагаем вам начать проверять сайт разработчика Android.Существует масса полезной информации о том, как начать

РЕДАКТИРОВАТЬ:

Вот введение в многопоточность на Android: http://developer.android.com/resources/articles/painless-threading.html

AsyncTask запускается в ThreadPool, поэтому нет никаких причин, по которым вы не можете выполнять обработку изображений там.По сути, это поток с приятными функциями, такими как простое взаимодействие с потоком пользовательского интерфейса.

Причина, по которой вы получаете это сообщение об ошибке, заключается в том, что вы вызываете методы для представления вне потока пользовательского интерфейса.Ссылка, которую я предоставил, дает несколько способов обойти это.Если у вас по-прежнему возникают проблемы, оставьте свой код или новый вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...