Simple Runnable实验适用于AVD但不适用于硬件设备

时间:2013-08-08 09:12:21

标签: 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;
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)。 (它只是一个Button和两个TextViews)

但是当我把它放到我的Nexus 4(4.3)上时,原始postDelayed(在“onStart”中)工作正常,但是第二个postDelayed,runnable本身的递归调用会引发空指针异常。

参见Logcat:

  

08-08 10:08:14.245:I / Button Act(19992):onTouch Event 08-08   10:08:14.245:I / Button Act(19992):.. 08-08 10:08:14.245:   I / Button Act(19992):postingAction Original 08-08 10:08:14.275:   I / Button Act(19992):onTouch Event 08-08 10:08:14.385:I / Button   Act(19992):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): postingAction   重复 08-08 10:08:14.495:D / AndroidRuntime(19992):关闭VM   08-08 10:08:14.495:W / dalvikvm(19992):threadid = 1:线程退出   未捕获的异常(组= 0x4152c700)08-08 10:08:14.495:   E / AndroidRuntime(19992):致命例外:主 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(原生方法)

谁能看到我做错了什么?所有帮助赞赏。对不起,如果我弄得一团糟问问题(LogCat ......我知道)! 安全旅行 !

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为问题可能是在你的switch case的默认情况下,你可以将myHandler设置为null。你有什么理由这样做吗?每次触摸时都会创建一个新的Handler,并且每次都将其置零。为什么要这么做?我只需在你的onCreate中放一个myHandler=new Handler();并保持这种状态,不需要将它设置为null并创建一个新的。