2013-11-25 129 views
1

我正在通过片段类实现OnTouch侦听器。OnTouch侦听器不工作在片段

public class ButtonFragment extends Fragment implements OnTouchListener 

Overriden onTouch函数看起来像。

@Override 
    public boolean onTouch(View v, MotionEvent event) { 
     // TODO Auto-generated method stub 
     switch(v.getId()) 
     { 
     case R.id.buttonUp : 
     { 
      mAction = new Thread(){ 
       @Override 
       public void run() 
       { 

        try { 
         ChartJNI3D.cameraPos(1.0f, 'U'); 
         mAction.wait(); 

        } catch (InterruptedException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
        } 
       } 
      }; 
      if(event.getAction() == MotionEvent.ACTION_DOWN) 
       mAction.start(); 
      else if (event.getAction() == MotionEvent.ACTION_UP) 
       mAction.stop(); 
     } 
     break; 

等等。 问题是只需要一个OnClick事件并调用该函数。 但是,当它遇到MotionEvent.ACTION_UP应用程序与NULL指针异常崩溃。 可以发布日志,如果有人需要它。

01-08 17:59:10.771: E/AndroidRuntime(3926): FATAL EXCEPTION: Thread-344 
01-08 17:59:10.771: E/AndroidRuntime(3926): java.lang.IllegalMonitorStateException: object not locked by thread before wait() 
01-08 17:59:10.771: E/AndroidRuntime(3926):  at java.lang.Object.wait(Native Method) 
01-08 17:59:10.771: E/AndroidRuntime(3926):  at java.lang.Object.wait(Object.java:364) 
01-08 17:59:10.771: E/AndroidRuntime(3926):  at com.example.sample3dchart.ButtonFragment$1.run(ButtonFragment.java:53) 
01-08 17:59:10.816: E/InputEventReceiver(3926): Exception dispatching input event. 
01-08 17:59:10.816: E/MessageQueue-JNI(3926): Exception in MessageQueue callback: handleReceiveCallback 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): java.lang.UnsupportedOperationException 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at java.lang.Thread.stop(Thread.java:1076) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at java.lang.Thread.stop(Thread.java:1063) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at com.example.sample3dchart.ButtonFragment.onTouch(ButtonFragment.java:64) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.View.dispatchTouchEvent(View.java:7241) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.View.dispatchPointerEvent(View.java:7426) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.os.MessageQueue.nativePollOnce(Native Method) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.os.MessageQueue.next(MessageQueue.java:125) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.os.Looper.loop(Looper.java:124) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at android.app.ActivityThread.main(ActivityThread.java:5041) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at java.lang.reflect.Method.invokeNative(Native Method) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at java.lang.reflect.Method.invoke(Method.java:511) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-08 17:59:10.821: E/MessageQueue-JNI(3926): at dalvik.system.NativeStart.main(Native Method) 

当代替

try { 
          ChartJNI3D.cameraPos(1.0f, 'U'); 
          mAction.wait(); 

         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

我做

try { 
          ChartJNI3D.cameraPos(1.0f, 'U'); 
          mAction.sleep(100); 

         } catch (InterruptedException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 

日志是

01-08 18:01:28.371: E/AndroidRuntime(4125): FATAL EXCEPTION: main 
01-08 18:01:28.371: E/AndroidRuntime(4125): java.lang.UnsupportedOperationException 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at java.lang.Thread.stop(Thread.java:1076) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at java.lang.Thread.stop(Thread.java:1063) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at com.example.sample3dchart.ButtonFragment.onTouch(ButtonFragment.java:64) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.View.dispatchTouchEvent(View.java:7241) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2174) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1917) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:1953) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1405) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.app.Activity.dispatchTouchEvent(Activity.java:2410) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:1901) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.View.dispatchPointerEvent(View.java:7426) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewRootImpl.deliverPointerEvent(ViewRootImpl.java:3220) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:3165) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:4292) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:4271) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:4363) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:179) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.os.MessageQueue.nativePollOnce(Native Method) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.os.MessageQueue.next(MessageQueue.java:125) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.os.Looper.loop(Looper.java:124) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at android.app.ActivityThread.main(ActivityThread.java:5041) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at java.lang.reflect.Method.invokeNative(Native Method) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at java.lang.reflect.Method.invoke(Method.java:511) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
01-08 18:01:28.371: E/AndroidRuntime(4125):  at dalvik.system.NativeStart.main(Native Method) 
+0

首先,您无法在Java中停止线程。 –

+0

这无关你的问题,而是因为你只要用户从视图升降机创建一个新的线程对象,你永远不会停止的旧线。 另外,stop()是不推荐的调用。 – DeeV

+1

这不是空指针异常。这是一个“UnsupportedOperationException”,因为你调用了一个无效的方法'stop()' – DeeV

回答

2

你崩溃的原因是因为你误用Java线程通过调用大量弃用的来实现对象方法来结束你的线程。

private MyThread mAction; 
    private class MyThread extends Thread() { 
    volatile boolean keepRunning = true; 

    @Override 
    public void run() { 
     try { 
     ChartJNI3D.cameraPos(1.0f, 'U'); 
     while(keepRunning); 
     } catch (InterruptedException e) {} 
    } 

    public void quit() { 
     keepRunning = false; 
    } 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
    switch(v.getId()) { 
     case R.id.buttonUp: { 
      if(event.getAction() == MotionEvent.ACTION_DOWN) 
       mAction = new MyThread(); 
       mAction.start(); 
      else if (event.getAction() == MotionEvent.ACTION_UP) 
       mAction.quit(); 
     } 
     break; 
    } 
    } 
+0

谢谢,会试试看。 –

+0

试过了,它工作正常,但仍然作为OnClickListener工作。 我想要实现连续输入,但不实现它。 而我不能保持'run()'预定义因为我有不同的按钮不同的定义。 –

+0

进行了一些更改。谢谢 –