0

私は Android 開発と StackOverflow の両方の初心者なので、つま先を踏んでも撃たないでください。ユーザーがボタンを押すと、ボタンが押されている間に表示される整数が増加し、ボタンが離されたときにボタンがそのままになる単純なアプリを動作させようとしています。画期的なもの!

だから私は次のアプローチを取りました:

public class MainActivity extends Activity {
Button pushBtn;
TextView textView,inc_txt;
String TAG ="Button Act";
int inc_val =0;
public Handler myHandler=null;
boolean finishedThread = false;
boolean threadRunning = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main); 
    Log.i(TAG, "in onCreate");

}
@Override
protected void onStart() {
    // TODO Auto-generated method stub
    super.onStart();
    Log.i(TAG, "in onStart");
    pushBtn=(Button)findViewById(R.id.Btn_Push);
    Log.i(TAG, "in onStart 1");
    textView=(TextView)findViewById(R.id.testText);
    inc_txt=(TextView)findViewById(R.id.increment_text);


    pushBtn.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent Button_event) {

            Log.i(TAG, "in onTouch Event");
            switch (Button_event.getAction()) {
            case MotionEvent.ACTION_DOWN:

                Log.i(TAG, " ..Down");
                textView.setText("Button Down");
                if(myHandler!=null)
                {
                    Log.i(TAG, "Handle was not null");
                    return true;
                }
                myHandler=new Handler();
                Log.i(TAG, "postingAction Original");
                myHandler.postDelayed(pushedAction, 250);


                return true;

            case MotionEvent.ACTION_UP:

                textView.setText("Button Up");
                myHandler.removeCallbacks(pushedAction);
                myHandler=null;


                return true;


            default:
                textView.setText("Default");
                myHandler=null;
                break;
            }
            return false;
        }


    });
    Log.i(TAG, "in onStart 3");
}

Runnable pushedAction= new Runnable() {

    @Override
    public void run() {
        inc_txt.setText(Integer.toString(inc_val));
        inc_val++;
        Log.i(TAG, "postingAction Repeat");
        myHandler.postDelayed(this, 250);
        // TODO Auto-generated method stub

    }
};

そして、これは AVD (4.2.2) で動作します。(ボタンと 2 つの TextViews のみ)

しかし、これを Nexus 4 (4.3) に配置しようとすると、元の postDelayed (「onStart」内) は正常に動作しますが、2 番目の postDelayed では、ランナブル自体の再帰呼び出しによって null ポインター例外がスローされます。

Logcat を参照してください。

08-08 10:08:14.245: I/Button Act(19992): onTouch イベント 08-08 10:08:14.245: I/Button Act(19992): ..Down 08-08 10:08:14.245: I /Button Act(19992): postedAction Original 08-08 10:08:14.275: I/Button Act(19992): in onTouch Event 08-08 10:08:14.385: I/Button Act(19992): in onTouch Event 08 -08 10:08:14.405: I/Button Act(19992): onTouch イベント 08-08 10:08:14.425: I/Button Act(19992): onTouch イベント 08-08 10:08:14.495: I/ Button Act(19992): postedAction Repeat 08-08 10:08:14.495: D/AndroidRuntime(19992): Shutting down VM 08-08 10:08:14.495: W/dalvikvm(19992): threadid=1: thread exiting withキャッチされない例外 (group=0x4152c700) 08-08 10:08:14.495: E/AndroidRuntime(19992):致命的な例外: メイン08-08 10:08:14.495: E/AndroidRuntime(19992):java.lang.NullPointerException08-08 10:08:14.495: E/AndroidRuntime(19992): com.example.buttonexperiments.MainActivity$1.run(MainActivity.java:94) 08-08 10:08:14.495: E/AndroidRuntime(19992): android.os.Handler.handleCallback(Handler.java:730) 08-08 10:08:14.495: E/AndroidRuntime(19992): android.os.Handler.dispatchMessage(Handler.java:92) 08-08 10 :08:14.495: E/AndroidRuntime(19992): android.os.Looper.loop(Looper.java:137) 08-08 10:08:14.495: E/AndroidRuntime(19992): android.app.ActivityThread. main(ActivityThread.java:5103) 08-08 10:08:14.495: E/AndroidRuntime(19992): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 08-08 10:08:14.495: E/AndroidRuntime (19992): java.lang.reflect.Method.invoke(Method.java:525) 08-08 10:08:14.495: E/AndroidRuntime(19992): com.android.internal.os で。ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 08-08 10:08:14.495: E/AndroidRuntime(19992): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 08-08 で10:08:14.495: E/AndroidRuntime(19992): dalvik.system.NativeStart.main(ネイティブメソッド)

誰かが私が間違っていることを見ることができますか? すべての助けに感謝します。質問をめちゃくちゃにしてしまったらごめんなさい(LogCat ..私は知っています)!安全な旅行 !

4

2 に答える 2

0

問題は、スイッチケースのデフォルトのケースとアクションアップで myHandler を null に設定することである可能性があると思います。そうする理由はありますか?タッチするたびに新しいハンドラーを作成し、毎回それを無効にします。どうしてそうするか?onCreateに amyHandler=new Handler();を入れてそのままにしておくだけです。 null に入れて新しいものを作成する必要はありません。

于 2013-08-08T09:49:58.103 に答える