简单的可运行实验 适用于 AVD,但不适用于硬件设备



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

但是当我把它放到我的 Nexus 4 (4.3( 上时,原来的 postDelay(在"onStart"中(工作正常,但第二个 postDelayed,可运行对象本身中的递归调用会抛出空指针异常。

请参阅日志猫:

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/按钮中 Act(19992(: 在 onTouch 事件 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/按钮法案(19992(:发布操作 重复 08-08 10:08:14.495:D/AndroidRuntime(19992(:关闭虚拟机 08-08 10:08:14.495: W/dalvikvm(19992(: threadid=1: 线程退出 未捕获的异常 (group=0x4152c700( 08-08 10:08:14.495: E/AndroidRuntime(19992(: 致命异常: main 08-08 10:08:14.495: E/AndroidRuntime(19992(: java.lang.NullPointerException 08-08 10:08:14.495: E/AndroidRuntime(19992(: at com.example.buttonexperiments.MainActivity$1.run(MainActivity.java:94( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at android.os.Handler.handleCallback(Handler.java:730( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at android.os.Handler.dispatchMessage(Handler.java:92( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at android.os.Looper.loop(Looper.java:137( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at android.app.ActivityThread.main(ActivityThread.java:5103( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at java.lang.reflect.Method.invokeNative(Native Method( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at java.lang.reflect.Method.invoke(Method.java:525( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553( 08-08 10:08:14.495: E/AndroidRuntime(19992(: at dalvik.system.NativeStart.main(Native Method(

谁能看出我做错了什么?所有的帮助都表示赞赏。对不起,如果我把这个问题问得一团糟( 日志猫.我知道(!祝你旅途平安!

我认为

问题可能是在开关情况的默认情况下,并且在操作中您将 myHandler 设置为 null。你这样做有什么理由吗?每次触摸时都会创建一个新的处理程序,每次将其清空。你为什么要这样做?我只会在您的onCreate中放一个myHandler=new Handler();并将其保留,无需将其设置为null并创建新的。

try { 
  //  Write your code here which cause the NullPointerException error ...
} catch (NullPointerException npe) { 
  // Just leave this section ...
}

最新更新