2013-08-08 3 views
0

저는 Android 개발과 StackOverflow에서 초보자입니다. 그래서 발가락을 밟으면 나를 쏘지 마세요! 버튼을 누르고있는 동안 사용자가 버튼을 누르고 표시된 정수가 증가하는 간단한 응용 프로그램을 얻으려고합니다. 버튼을 놓을 때 버튼이 그대로 유지됩니다. 땅을 깨는 물건!간단한 Runnable 실험 AVD에서 작동하지만 하드웨어 장치에서는 작동하지 않습니다.

그래서 나는 다음과 같은 접근 방식 갔다 : 이것은 AVD (4.2.2)에서 작동

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 

    } 
}; 

행복한 일. (그냥 버튼 하나와 두 개의 TextViews)

하지만 Nexus 4 (4.3)에 붙여 넣을 때 원래의 postDelayed ("onStart")는 제대로 작동하지만 두 번째 postDelayed는 runnable 자체가 null 포인터 예외를 throw합니다. 19,992 (I/버튼 법 :

08-08 : 10 : 08 : 14.245 : I/버튼 법 (19992) : onTouch 이벤트에 08-08 10 : 08 : 14.245

는 로그 캣을 참조하십시오) : .. 아래 08-08 10 : 08 : 14.245 : I/Button Act (19992) : postingAction 원본 08-08 10 : 08 : 14.275 : I/Button Act (19992) : onTouch 이벤트 08-08 10 : 08 : 14.385 : I/Button Act (19992) : inTouch 이벤트 08-08 10 : 08 : 14.405 : I/Button Act (19992) : inTouch 이벤트 08-08 10 : 08 : 14.425 : I/버튼 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 (19,992) FATAL EXCEPTION : 메인 08-08 10 : 08 : 14.495 : E/AndroidRuntime (19,992) java.lang.NullPointerException이 08-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 .. 내가 아는)을 묻는 혼란을 만든다면! 안전한 여행!

답변

0

나는 문제가 스위치 케이스의 기본 경우에 당신이 myHandler가 null로 넣어까지 행동이 될 것 같아요. 왜 그렇게하는 이유가 있을까요? 매번 누를 때마다 새로운 핸들러를 생성합니다. 왜 그걸 할거야? 나는 당신의 onCreate에 myHandler=new Handler();을 넣고 그런 식으로 남겨두고 null에 넣고 새로운 것을 만들 필요가 없다.

+0

당신 말이 맞습니다. 나는 이것을 한 온라인 설명서를 따랐다. 나는 그것을 바꿨고 효과가있다. 고마워. C++로 다시 보내주세요! –

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

도움 주셔서 감사하지만 같은 문제가 있습니다. '시도 { \t \t \t myHandler.postDelayed (this, 250); \t \t \t \t \t} \t 캐치 (NullPointerException이 된 NPE) \t \t \t \t { \t \t \t Log.i ("Excep"npe.getMessage()); \t \t \t} –