【问题标题】:App crashes on closing a Fragment due to running Thread由于运行线程,应用程序在关闭片段时崩溃
【发布时间】:2012-10-15 13:31:40
【问题描述】:

我的 Fragmant 包含一个 SensorEventListener,它应该评估 LightSensor 的一些输入。

LightDisp 是我的观点。我认为它崩溃是因为 Fragment 已经关闭,但 LightSensor 触发了 Fragment 以执行这个仍在工作的方法:

private void setBackground(int Backgroundcolor) {
    Resources r = getResources();
    Drawable[] layers = new Drawable[2];
    layers[0] = new ColorDrawable(Color.rgb(Backgroundcolor,
            Backgroundcolor, Backgroundcolor));
    layers[1] = r.getDrawable(R.drawable.screen);
    LayerDrawable layerDrawable = new LayerDrawable(layers);
    LightDisp.setBackgroundDrawable(layerDrawable);
    LightDisp.invalidate();
}

如何避免这种情况? 使用 LightDisp.post() 方法也没有解决问题。 PS:我将延迟设置到 sensorListener 的速度越慢,崩溃就越少。使用 SENSOR_DELAY_FASTEST 几乎每次都会崩溃。

LogCat:

10-15 15:36:46.361: D/SensorManager(10304): registerListener :: handle = 3  name= GP2A Light Sensor delay= 10000 Listener= ch.steff_94.morseapp_beta.Input_lightsensor$1@418d52d8
10-15 15:36:46.366: E/SensorManager(10304): thread start
10-15 15:36:46.366: E/SensorManager(10304): =======>>> Sensor Thread Running <<<========
10-15 15:36:52.436: D/dalvikvm(10304): GC_CONCURRENT freed 390K, 4% free 14754K/15367K, paused 1ms+4ms
10-15 15:36:58.971: D/SensorManager(10304): unregisterListener:: handle = 3 Listener= ch.steff_94.morseapp_beta.Input_lightsensor$1@418d52d8 name = GP2A Light Sensor
10-15 15:37:06.711: D/AndroidRuntime(10304): Shutting down VM
10-15 15:37:06.711: W/dalvikvm(10304): threadid=1: thread exiting with uncaught exception (group=0x40c5d1f8)
10-15 15:37:06.756: E/AndroidRuntime(10304): FATAL EXCEPTION: main
10-15 15:37:06.756: E/AndroidRuntime(10304): java.lang.IllegalStateException: Fragment Input_lightsensor{418d4c00} not attached to Activity
10-15 15:37:06.756: E/AndroidRuntime(10304):    at android.app.Fragment.getResources(Fragment.java:741)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at ch.steff_94.morseapp_beta.Input_lightsensor.setBackground(Input_lightsensor.java:133)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at ch.steff_94.morseapp_beta.Input_lightsensor.access$2(Input_lightsensor.java:132)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at ch.steff_94.morseapp_beta.Input_lightsensor$1.onSensorChanged(Input_lightsensor.java:281)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at android.hardware.SensorManager$ListenerDelegate$1.handleMessage(SensorManager.java:635)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at android.os.Looper.loop(Looper.java:137)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at android.app.ActivityThread.main(ActivityThread.java:4511)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at java.lang.reflect.Method.invokeNative(Native Method)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at java.lang.reflect.Method.invoke(Method.java:511)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
10-15 15:37:06.756: E/AndroidRuntime(10304):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

  • 你在你的FragmentsonCreate做这个吗?或者onActivityCreated
  • @AlexLockwood 我在private SensorEventListener lightSensorEventListener = new SensorEventListener(){ public void onSensorChanged(SensorEvent event)}做这个@

标签: java android multithreading user-interface listener


【解决方案1】:

您收到“片段未附加到 Activity”异常,所以我的猜测是您在创建 Activity 之前实例化了 Fragment 中的某些内容。弄清楚这可能是什么,然后将其移至您的 onActivityCreated() 方法。

【讨论】:

    【解决方案2】:

    刚刚发现问题: 我必须注销Listener,因为我提交了我的FragmentTransaction 而不是onPause() 方法;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-26
      • 1970-01-01
      • 2015-10-29
      相关资源
      最近更新 更多