传感器模拟器的NetworkOnMainThreadException

时间:2013-12-15 15:20:57

标签: android android-asynctask android-sensors

我按照此说明使用传感器模拟器在模拟器上调试我的应用程序: http://code.google.com/p/openintents/wiki/SensorSimulator#How_to_use_the_in_your_application

我完成了上述所有步骤,但在我的情况下,一切都不像说明中所描述的那么简单。我得到NetworkOnMainThreadException试图连接,注册监听器等。所以我创建了异步任务来解决这个问题。现在,我有以下内容:

与模拟器的连接:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    sensorManager = SensorManagerSimulator.getSystemService(this, SENSOR_SERVICE);
        this.new ConnectToSimulator().execute();
    }

onResume()listner的注册:

@Override
public void onResume() {
    super.onResume();
    this.new RegisterToSimulator().execute();       
}

最后我的任务:

class ConnectToSimulator extends AsyncTask<Object, Object, Object> {   
    @Override
    protected Object doInBackground(Object... arg0) {
        try{
        sensorManager.connectSimulator();
        }catch(Exception e)
        {
            Log.i("error", e.getMessage());
        }
        return null;
    }       
}

class RegisterToSimulator extends AsyncTask<Object, Object, Object> {      
    @Override
    protected Object doInBackground(Object... arg0) {
        try{
            sensorManager.registerListener(Compass.this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST);
            sensorManager.registerListener(Compass.this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_FASTEST);
            sensorManager.registerListener(Compass.this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_FASTEST);
        }catch(Exception e)
        {
            Log.i("error", e.getMessage());
        }
        return null;
    }

}

但即使在那之后,我仍然收到尝试在模拟器上启动应用程序的错误:

  

12-15 14:23:28.877:E / AndroidRuntime(3724):致命异常:主要   12-15 14:23:28.877:E / AndroidRuntime(3724):android.os.NetworkOnMainThreadException   12-15 14:23:28.877:E / AndroidRuntime(3724):在android.os.StrictMode $ AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117)   12-15 14:23:28.877:E / AndroidRuntime(3724):at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163)   12-15 14:23:28.877:E / AndroidRuntime(3724):at libcore.io.IoBridge.recvfrom(IoBridge.java:513)   12-15 14:23:28.877:E / AndroidRuntime(3724):at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488)   12-15 14:23:28.877:E / AndroidRuntime(3724):at java.net.PlainSocketImpl.access $ 000(PlainSocketImpl.java:46)   12-15 14:23:28.877:E / AndroidRuntime(3724):at java.net.PlainSocketImpl $ PlainSocketInputStream.read(PlainSocketImpl.java:240)   12-15 14:23:28.877:E / AndroidRuntime(3724):at java.io.InputStreamReader.read(InputStreamReader.java:244)   12-15 14:23:28.877:E / AndroidRuntime(3724):at java.io.BufferedReader.fillBuf(BufferedReader.java:130)   12-15 14:23:28.877:E / AndroidRuntime(3724):at java.io.BufferedReader.readLine(BufferedReader.java:354)   12-15 14:23:28.877:E / AndroidRuntime(3724):at org.openintents.sensorsimulator.hardware.SensorSimulatorClient.readSensor(SensorSimulatorClient.java:654)   12-15 14:23:28.877:E / AndroidRuntime(3724):at org.openintents.sensorsimulator.hardware.SensorSimulatorClient.readSensor(SensorSimulatorClient.java:571)   12-15 14:23:28.877:E / AndroidRuntime(3724):at org.openintents.sensorsimulator.hardware.SensorSimulatorClient.access $ 1000(SensorSimulatorClient.java:53)   12-15 14:23:28.877:E / AndroidRuntime(3724):at org.openintents.sensorsimulator.hardware.SensorSimulatorClient $ 1.handleMessage(SensorSimulatorClient.java:505)   12-15 14:23:28.877:E / AndroidRuntime(3724):在android.os.Handler.dispatchMessage(Handler.java:99)   12-15 14:23:28.877:E / AndroidRuntime(3724):在android.os.Looper.loop(Looper.java:137)   12-15 14:23:28.877:E / AndroidRuntime(3724):在android.app.ActivityThread.main(ActivityThread.java:5039)   12-15 14:23:28.877:E / AndroidRuntime(3724):at java.lang.reflect.Method.invokeNative(Native Method)   12-15 14:23:28.877:E / AndroidRuntime(3724):at java.lang.reflect.Method.invoke(Method.java:511)   12-15 14:23:28.877:E / AndroidRuntime(3724):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:793)   12-15 14:23:28.877:E / AndroidRuntime(3724):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)   12-15 14:23:28.877:E / AndroidRuntime(3724):at dalvik.system.NativeStart.main(Native Method)

有人可以澄清为什么我有这么奇怪的错误吗?此外,在模拟器指令中没有关于异步任务使用必要性的信息,也许我做错了。请提前帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

不幸的是,由于未实现库,因此无法绕过此错误 “新的”SDK限制。

最简单的解决方案是将manifest中的minSdkVersion设置为Honeycomb之前的内容 (例如android:minSdkVersion =“8”)。

Reson就是这样,虽然您在后台线程上连接了,但您仍然创建了 UI线程上的对象,返回意味着SensorSimulatorClient将使用套接字 UI线程上的通信。