Android 简单的可运行实验可以在AVD上运行,但不能在硬件设备上运行

Android 简单的可运行实验可以在AVD上运行,但不能在硬件设备上运行,android,nullpointerexception,runnable,postdelayed,Android,Nullpointerexception,Runnable,Postdelayed,我是Android开发和StackOverflow的初学者,所以如果我踩到任何脚趾,请不要开枪! 我正在尝试让一个简单的应用程序工作,当用户按下按钮时,显示的整数递增,当按下按钮时,按钮保持不变。开创性的东西 因此,我采用了以下方法: public class MainActivity extends Activity { Button pushBtn; TextView textView,inc_txt; String TAG ="Button Act"; int inc_val =0; pu

我是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)。(它只是一个按钮和两个文本视图)

但是当我把它放到我的Nexus4(4.3)上时,原来的postDelayed(在“onStart”中)工作得很好,但是第二个postDelayed,runnable中的递归调用本身抛出了一个null指针异常

请参阅日志:

08-08 10:08:14.245:I/按钮动作(19992):在onTouch事件中08-08 10:08:14.245:I/按钮动作(19992):…向下08-08 10:08:14.245: I/按钮动作(19992):张贴动作原件08-08 10:08:14.275: I/按钮动作(19992):在onTouch事件中08-08 10:08:14.385:I/按钮 动作(19992):在onTouch事件08-08 10:08:14.405:I/按钮动作(19992): 在onTouch事件中08-08 10:08:14.425:I/按钮动作(19992):在onTouch中 事件08-08 10:08:14.495:I/按钮动作(19992):定位动作 重复08-08 10:08:14.495:D/AndroidRuntime(19992):关闭虚拟机 08-08 10:08:14.495:W/dalvikvm(19992):threadid=1:线程以 未捕获异常(组=0x4152c700)08-08 10:08:14.495: E/AndroidRuntime(19992):致命异常:main08-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) 2008-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.Invokenactive(本机方法)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) 2008-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(本机方法)

有人能看出我做错了什么吗?谢谢你的帮助。对不起,如果我把问题问得一团糟的话(我知道)!
一路平安

我认为问题可能在于,在开关的默认情况下,在实际操作中,您将myHandler设置为null。你这样做有什么原因吗?每次触摸时都会创建一个新的处理程序,每次都会将其设置为null。你为什么要那样做?我只需要放置一个
myHandler=newhandler()并保留它,无需将其设置为null并创建新的。

感谢您的帮助,但同样的问题也存在<代码>尝试{myHandler.postDelayed(this,250);}catch(NullPointerException npe){Log.i(“Excep”,npe.getMessage());}
你是对的。我是在遵循一个在线教程,做到这一点。我改变了它,它工作了。谢谢。把我发回到C++!
try { 
  //  Write your code here which cause the NullPointerException error ...
} catch (NullPointerException npe) { 
  // Just leave this section ...
}