Исключение NetworkOnMainThreadException симулятора датчика

Я выполнил эту инструкцию для отладки своего приложения на эмуляторе с помощью симулятора датчика: 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():

@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;
    }

}

но даже после этого я все еще получаю сообщение об ошибке при попытке запустить приложение на эмуляторе:

Может кто-нибудь объяснить, почему у меня такая странная ошибка? кроме того, в инструкции симулятора нет информации о необходимости использования асинхронной задачи, возможно, я что-то не так делаю. Пожалуйста, помогите, заранее спасибо.

К сожалению, эту ошибку нельзя обойти, так как библиотека не реализована с "новыми" ограничениями SDK.


person Martin    schedule 15.12.2013    source источник
comment
12-15 14:23:28.877: E/AndroidRuntime(3724): НЕИСПРАВНОЕ ИСКЛЮЧЕНИЕ: main 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): в libcore.io.BlockGuardOs.recvfrom(BlockGuardOs .java:163) 12–15 14:23:28.877: E/AndroidRuntime(3724): в libcore.io.IoBridge.recvfrom(IoBridge.java:513) 12–15 14:23:28.877: E/AndroidRuntime(3724) ): в java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 12-15 14:23:28.877: E/AndroidRuntime(3724): в java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 12 -15 14:23:28.877: E/AndroidRuntime(3724): в java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 12-15 14:23:28.877: E/AndroidRuntime(3724): в java .io.InputStreamReader.read(InputStreamReader.java:244) 12–15 14:23:28.877: E/AndroidRuntime(3 724): в java.io.BufferedReader.fillBuf(BufferedReader.java:130) 12-15 14:23:28.877: E/AndroidRuntime(3724): в java.io.BufferedReader.readLine(BufferedReader.java:354) 12 -15 14:23:28.877: E/AndroidRuntime(3724): в org.openintents.sensorsimulator.hardware.SensorSimulatorClient.readSensor(SensorSimulatorClient.java:654) 12-15 14:23:28.877: E/AndroidRuntime(3724): в org.openintents.sensorsimulator.hardware.SensorSimulatorClient.readSensor(SensorSimulatorClient.java:571) 12-15 14:23:28.877: E/AndroidRuntime(3724): в org.openintents.sensorsimulator.hardware.SensorSimulatorClient.access$1000(SensorSimulatorClient .java:53) 12-15 14:23:28.877: E/AndroidRuntime(3724): в 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): в java.lang.reflect.Method.invokeNative(собственный метод) 12-15 14:23:28.877: E/AndroidRuntime(3724): в java.lang.reflect.Method.invoke(Method.java:511 ) 12-15 14:23:28.877: E/AndroidRuntime(3724): в com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 12-15 14:23:28. 877: E/AndroidRuntime(3724): в com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 12-15 14:23:28.877: E/AndroidRuntime(3724): в dalvik.system.NativeStart .main(собственный метод)   -  person MoRe    schedule 09.12.2014


Ответы (1)


Самое простое решение - установить minSdkVersion в манифесте перед Honeycomb (например, android:minSdkVersion="8").

Резон для этого заключается в том, что, несмотря на то, что вы подключились к фоновому потоку, вы все равно создали объект в своем потоке пользовательского интерфейса, что, в свою очередь, означает, что SensorSimulatorClient будет использовать связь через сокет в вашем потоке пользовательского интерфейса.

У меня та же проблема, но мне не хочется создавать асинхронную задачу, и даже снижение целевого API стоит затраченных усилий. Я просто буду использовать реальные устройства для тестирования вместо эмулятора... жаль, что проект симулятора больше не активен :(

person Drago    schedule 15.12.2013