2012-03-04 205 views
1

在过去一周的每一天的大部分时间里,我一直在研究用电位计输入控制文本字段的项目,并且我的setText命令不断使程序崩溃。我厌倦了修修补补和调试,但很少完成任务,而且我需要一些帮助。setText导致崩溃

如果您需要查看所有项目文件,我也可以上传它们。

搜索“这条线会导致系统崩溃”

package edu.uidaho.pong; 

import java.io.IOException; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.os.Handler; 
import android.os.Message; 
import android.widget.Toast; 
import android.app.Activity; 

import android.view.SurfaceHolder; 

public class GameThread extends Thread { 


    /** Handle to the surface manager object we interact with */ 
    private SurfaceHolder _surfaceHolder; 
    private Paint _paint; 
    private GameState _state; 
    public PongActivity _pong; 

    public GameThread(SurfaceHolder surfaceHolder, Context context, 
      Handler handler) { 
     _surfaceHolder = surfaceHolder; 
     _paint = new Paint(); 
     _state = new GameState(); 
     _pong = new PongActivity(); 

    } 

// @Override 
    public void run() { 
     while (true) { 
      Canvas canvas = _surfaceHolder.lockCanvas(); 
      _state.update(_pong); 
      _state.draw(canvas, _paint); 
      _surfaceHolder.unlockCanvasAndPost(canvas); 


      int ret = 0; 
      byte[] buffer = new byte[16384]; 
      int i; 

      int tempdebug = 0; 
      //while (true) { // read data 
      while (tempdebug++ < 10){ 
//    try { 
//     ret = _pong.mInputStream.read(buffer); 
//    } catch (IOException e) { 
//     break; 
//    } 
       ret = 5; // let's pretend there's a 5 every time since I can't test the usb 

       i = 0; 
       while (i < ret) { 
        int len = ret - i; 
        if (len >= 1) { 
         Message m = Message.obtain(_pong.mHandler); 
         int value = (int)buffer[i]; 
         // 'f' is the flag, use for your own logic 
         // value is the value from the arduino 
         m.obj = new ValueMsg('f', value); 
         _pong.mHandler.sendMessage(m); 
        } 
        i += 1; // number of bytes sent from arduino 
       } 
      } 
      //_pong.mResponseField.setText("Reading: "); This line causes a crash 

     } 
    } 

    public GameState getGameState() { 
     return _state; 
    } 
} 

logcat的输出 -

03-03 22:45:49.639: W/dalvikvm(381): threadid=9: thread exiting with uncaught exception (group=0x40015560) 
03-03 22:45:49.639: E/AndroidRuntime(381): FATAL EXCEPTION: Thread-10 
03-03 22:45:49.639: E/AndroidRuntime(381): java.lang.NullPointerException 
03-03 22:45:49.639: E/AndroidRuntime(381): at edu.uidaho.pong.GameThread.run(GameThread.java:70) 
03-03 22:45:50.189: E/global(381): Deprecated Thread methods are not supported. 
03-03 22:45:50.189: E/global(381): java.lang.UnsupportedOperationException 
03-03 22:45:50.189: E/global(381): at java.lang.VMThread.stop(VMThread.java:85) 
03-03 22:45:50.189: E/global(381): at java.lang.Thread.stop(Thread.java:1280) 
03-03 22:45:50.189: E/global(381): at java.lang.Thread.stop(Thread.java:1247) 
03-03 22:45:50.189: E/global(381): at edu.uidaho.pong.GameView.surfaceDestroyed(GameView.java:46) 
03-03 22:45:50.189: E/global(381): at android.view.SurfaceView.reportSurfaceDestroyed(SurfaceView.java:587) 
03-03 22:45:50.189: E/global(381): at android.view.SurfaceView.updateWindow(SurfaceView.java:481) 
03-03 22:45:50.189: E/global(381): at android.view.SurfaceView.onWindowVisibilityChanged(SurfaceView.java:213) 
03-03 22:45:50.189: E/global(381): at android.view.View.dispatchWindowVisibilityChanged(View.java:4027) 
03-03 22:45:50.189: E/global(381): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720) 
03-03 22:45:50.189: E/global(381): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720) 
03-03 22:45:50.189: E/global(381): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720) 
03-03 22:45:50.189: E/global(381): at android.view.ViewGroup.dispatchWindowVisibilityChanged(ViewGroup.java:720) 
03-03 22:45:50.189: E/global(381): at android.view.ViewRoot.performTraversals(ViewRoot.java:782) 
03-03 22:45:50.189: E/global(381): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 
03-03 22:45:50.189: E/global(381): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-03 22:45:50.189: E/global(381): at android.os.Looper.loop(Looper.java:130) 
03-03 22:45:50.189: E/global(381): at android.app.ActivityThread.main(ActivityThread.java:3683) 
03-03 22:45:50.189: E/global(381): at java.lang.reflect.Method.invokeNative(Native Method) 
03-03 22:45:50.189: E/global(381): at java.lang.reflect.Method.invoke(Method.java:507) 
03-03 22:45:50.189: E/global(381): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
03-03 22:45:50.189: E/global(381): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
03-03 22:45:50.189: E/global(381): at dalvik.system.NativeStart.main(Native Method) 
+0

把你的logcat的...... – 2012-03-04 06:18:53

+0

mResponseField的东西,你实现的?它不是Activity类的成员。在PongActivity的构造函数中添加一个调试打印 - 确保它已经被初始化。 – alfasin 2012-03-04 06:31:25

+0

如何添加调试打印?我试着敬酒,但遇到了无法从一个线程敬酒的问题。 – SwimBikeRun 2012-03-04 06:48:50

回答

2

我不能说完全由于没有logcat的,但是这可能发生,因为你”重新尝试从Android中禁止的单独线程更改您的TextView。解决此问题的方法之一是在运行单独线程的类中引用Activity,并将View代码更改为Activity.runOnUiThread()方法,该方法将Runnable作为参数。希望这可以帮助。

编辑

_pong.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       _pong.mResponseField.setText("Reading: "); 
      } 
     }); 
+0

谢谢!但是,我不确定如何遵循您的建议。 正确的,我正在改变TextView从一个单独的线程。那么,我如何创建这个对我的活动的引用?我有一个目前正在调用的对象实例。我不想要这个,因为它在另一个线程上被调用? “_pong.mHandler.sendMessage(米);” 如果你能指导我一个有用的例子。我无法从开发站点创建必要的代码。 http://developer.android.com/reference/android/app/Activity.html#runOnUiThread(java.lang.Runnable) 所以“runOnUiThread(_pong.mHandler.sendMessage(m);)”? – SwimBikeRun 2012-03-04 06:54:38

+0

@ user1018733,我会用代码片段编辑我的答案。 – Egor 2012-03-04 07:15:22

+0

我把这段代码放入我的游戏线程类“public class GameThread extends Thread”的public void run()函数中。 所以我的代码看起来像'公共无效的run(){// ... 您的代码段在这里 // ... }' 我得到一个错误“的方法run()的新类型的的Runnable (){}必须重写一个超类方法 – SwimBikeRun 2012-03-04 16:41:34