NullPointerException на некоторых телефонах, а не на других (тот же уровень API) - PullRequest
0 голосов
/ 24 января 2012

У меня есть приложение для Android, которое получает исключение NullPointerException на некоторых телефонах (все 2.3.x), но не на моем телефоне (также 2.3.x) или на любом из симуляторов.

Конкретное исключение, похоже, не дает никаких указаний на то, что оно происходит в моем коде, поэтому я предполагаю, что я звоню, что какая-то версия того же API-компонента неверна? Я не уверен, что с этим делать.

Вот журнал ошибок от logcat:

01-23 14:25:33.614: D/AndroidRuntime(25648): Shutting down VM
01-23 14:25:33.614: W/dalvikvm(25648): threadid=1: thread exiting with uncaught exception          (group=0x4001d648)
01-23 14:25:33.634: E/AndroidRuntime(25648): FATAL EXCEPTION: main
01-23 14:25:33.634: E/AndroidRuntime(25648): java.lang.NullPointerException
01-23 14:25:33.634: E/AndroidRuntime(25648):    at   android.widget.TextView.onTouchEvent(TextView.java:7479)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.View.dispatchTouchEvent(View.java:3932)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:906)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1784)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1157)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.app.Activity.dispatchTouchEvent(Activity.java:2228)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1759)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewRoot.deliverPointerEvent(ViewRoot.java:2352)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.view.ViewRoot.handleMessage(ViewRoot.java:1992)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.os.Looper.loop(Looper.java:150)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at android.app.ActivityThread.main(ActivityThread.java:4293)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at java.lang.reflect.Method.invokeNative(Native Method)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at java.lang.reflect.Method.invoke(Method.java:507)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:849)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:607)
01-23 14:25:33.634: E/AndroidRuntime(25648):    at dalvik.system.NativeStart.main(Native Method)

Вот трассировка стека от отладчика:

Thread [<1> main] (Suspended (exception NullPointerException))  
ViewRoot.handleMessage(Message) line: 1994  
ViewRoot(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 150 
ActivityThread.main(String[]) line: 4293    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]  
Method.invoke(Object, Object...) line: 507  
ZygoteInit$MethodAndArgsCaller.run() line: 849  
ZygoteInit.main(String[]) line: 607 
NativeStart.main(String[]) line: not available [native method]  

Ошибка возникает сразу же, когда начинается действие, и хотя ни одна из отладочной информации не указывает нигде в моем коде, я предполагаю, что что-то в onCreate() приведет к этому, поэтому вот onCreate() для рассматриваемой операции:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.player);
    int pid = getIntent().getIntExtra("pid", -1);
    mCurrSlide = null;
    myPresentation = thingListVideos.getVideoByPID(pid);

    loading = ProgressDialog.show(Player.this, "...",
            "downloading stuff", true, true);
    video_handler = new Handler() {
        public void handleMessage(Message msg) {
            loading.dismiss();
            Log.v(TAG, "Dismissed Dialog");
            videoView = (VideoView) findViewById(R.id.VideoView);
            prepareVideoView(videoView);
            videoView.requestFocus();
        }
    };

    new Thread(new Runnable() {
        @Override
        public void run() {

            mCurrSlideThread = new Thread() {
                public void run() {
                    getTiming();
                    videoView.postDelayed(mCurrSlideThread, 1000);
                }
            };
            sView = (LinearLayout) findViewById(R.id.LayoutS);
            prepare(slideView);
            video_handler.sendEmptyMessage(0);
        }
    }).start();

}

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

Я несколько новичок в Android и не знаю, что может быть причиной этого или почему это происходит на некоторых устройствах, а не на других, даже если у них должны быть идентичные версии API Android. Если кто-то видел что-то подобное раньше или имеет представление о том, что может быть причиной этого, некоторые указания относительно того, где искать, будут очень благодарны.

1 Ответ

0 голосов
/ 24 января 2012

Поскольку вы преднамеренно настраиваете состояние гонки, вы должны быть готовы к тому, что ваш контроль и т. Д. Еще не существует. Время - это все, и поэтому оно «работает на моей машине».

Вы не должны запускать темы в onCreate, поскольку вы участвуете в последовательности запуска activiy. Использование AsyncTask было бы лучшим способом; система управляет потоками для вас!

Методы onPause и onResume - это то место, где вы должны выполнять управление потоками. Это события жизненного цикла, которые происходят, когда ваша активность скрывается и не скрывается. Для обработки не в пользовательском интерфейсе вы можете использовать onStart и onStop, чтобы получить больше обработки, но не для материалов, связанных с пользовательским интерфейсом.

По-прежнему действует рекомендация «проверить наличие null».

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