0

一部の電話 (すべて 2.3.x) で NullPointerException を取得している Android アプリがありますが、私の電話 (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に少し慣れていないので、何が原因なのか、同じバージョンのAndroid APIが必要な場合でも、一部のデバイスで発生し、他のデバイスでは発生しない理由がわかりません。誰かが以前にこのようなものを見たことがある場合、または何が原因であるかについて何らかの考えがある場合は、どこを見ればよいかについてのいくつかの指針をいただければ幸いです.

4

1 に答える 1

0

意図的に競合状態を設定しているため、コントロールなどがまだ存在しないように準備する必要があります。タイミングがすべてであり、それが「私のマシンで動作する」理由です。

アクティビティの起動シーケンスと競合しているため、スレッドを開始しないでください。onCreateを使用するAsyncTask方が良い方法です。システムがスレッド化を管理します!

onPauseおよびメソッドは、onResumeスレッド管理を行うべき場所です。これらは、アクティビティが隠されている場合と隠されていない場合に発生するライフサイクル イベントです。UI 以外の処理には使用できるため、より多くの処理onStartonStop行うことができますが、UI 関連のものには使用できません。

「check for null」アドバイスは引き続き適用されます。

于 2012-01-24T12:51:14.190 に答える