【问题标题】:Why does my Android App crash if Bluetooth Socket is not available?如果蓝牙 Socket 不可用,为什么我的 Android 应用程序会崩溃?
【发布时间】:2015-04-02 14:54:57
【问题描述】:

我编写了一个应用程序,通过蓝牙从 arduino 获取传感器数据。

只要蓝牙插座可用,一切正常。 如果我关闭 arduino 并尝试打开应用程序,那么我的应用程序就会崩溃。

public class GetData extends Activity {

    TextView t1, t2, t3, t4, t5, t6, t7, t8;
    ImageView schulter,ellenbogen,greifer,pfeil;
    long cb1, cb2, m1, m2, m3, m4, m5, m6;
    long[] motor = new long[8];
    Handler handler = new Handler(); //Assistent zur Ausführung
    long timer = 300; //Millisekunden
    static final double PI = 3.141592653589793 ;
    InputStream inStream = null;
    BluetoothSocket btSocket = null;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_get_data);

        runnable.run();
    }


    public Runnable runnable = new Runnable() {
        @Override
        public void run() {
            referenceXML();
            getDatafromBT();
            setLongfromBT();

            if(((motor[0] == 2) && (motor[7] == 3)) || ((motor[0] == 4) && (motor[7] == 3))) {
                setViews();
                setImageViews();
                XMLbewegungSchulter();
                XMLbewegungEllenbogen();
                XMLbewegungGreifer();
            }
            handler.postDelayed(runnable,timer);
        }
    };

这里是BtConnect.class

public class BtConnect extends Application  {
....
....
....
    public long[] getData() {
    int bytesAvailable = 0;
    long[] results = new long[8];
    try {
        bytesAvailable = inStream.available();
        if (btSocket.isConnected() && bytesAvailable != 0) { // Prüft ob Verbindung noch besteht und Daten verfügbar sind

            String StringBuffer = "";
            byte[] inByte = new byte[1];

            for (int i = 0; i < 8; i++) {
                while (1 == 1) {
                    inStream.read(inByte);

                    if (inByte[0] == ',') {
                        results[i] = Long.parseLong(StringBuffer, 10);  // Zeichenkette in Zahlen wandeln
                        //Toast.makeText(mContext, "Ausgabe von inStream: " + results[i] + "\n", Toast.LENGTH_SHORT).show();
                        break;
                    } else {
                        StringBuffer += (char) inByte[0]; //Zeichenkette wird solange dazuaddiert, bis ein Komma von inByte[0] bestätigt wird
                    }
                }

                StringBuffer = "";
            }
            return results;
        }

    } catch (IOException e) {
        return new long[8];
    }
    return new long[8];
}

}

我知道我的问题只有在我启用getDatafromBT() 时才会出现。如果我禁用它,那么我的应用程序将毫无问题地启动,但我当然不会得到任何数据。

    public void getDatafromBT() {

    BtConnect btConnect = (BtConnect) getApplication();
    motor = btConnect.getData();
}

你的意思是这个堆栈跟踪吗?对不起,我的英语不太好。

java.lang.RuntimeException: Unable to create application de.hs.karlsruhe.hskabot.ws13.BtConnect: java.lang.ClassCastException: de.hs.karlsruhe.hskabot.ws13.BtConnect cannot be cast to de.hs.karlsruhe.hskabot.ws13.GetData
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4447)
        at android.app.ActivityThread.access$1300(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)
Caused by: java.lang.ClassCastException: de.hs.karlsruhe.hskabot.ws13.BtConnect cannot be cast to de.hs.karlsruhe.hskabot.ws13.GetData
        at de.hs.karlsruhe.hskabot.ws13.BtConnect.onCreate(BtConnect.java:79)
        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4444)
        at android.app.ActivityThread.access$1300(ActivityThread.java:141)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1316)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你调试的时候发生了什么?代码在哪里崩溃?打印什么日志语句?打印语句中有什么?您期望什么与发生什么以及何时发生?你试过什么?
  • 如果你分享 堆栈跟踪 stackoverflow.com/questions/3988788/… 会有帮助

标签: java android handler runnable bluetooth-socket


【解决方案1】:

您正在从空对象获取属性。所以NPE。如果您不想出现异常,请执行 if-else 检查:

public void getDatafromBT() {
  BtConnect btConnect = (BtConnect) getApplication();
  if (btConnect != null) 
    motor = btConnect.getData();
  else 
    // toast, close app or anything you need app does...

【讨论】:

  • 看来我的 btConnect 一直是 null O.o
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多