【问题标题】:Android App crashes when unplugged from usb从 USB 拔出时,Android 应用程序崩溃
【发布时间】:2012-07-17 17:46:19
【问题描述】:

我的应用程序启动一个Activity,它使用两个FragmentsList 中的选定项目提供详细信息。

应用程序在启动时读取外部存储上的SQLite DB。 此外,它还从外部存储上的 xml 文件中收集数据。

一切都很顺利:)

但由于我正在使用抽象类来重用我的详细代码Fragments,因此应用程序开始表现得很奇怪。 当我从 USB 插入或拔出设备而详细信息 Fragment 处于打开或隐藏状态时 - 应用程序崩溃。

“抱歉,应用程序 xyz 已意外停止。...请尝试 再次“

我认为它与细节Fragments 相关。我不确定,因为如果您拔下设备,调试器或日志记录将无法工作:D
但其他功能正常。

如果您拔下设备,应用会发生什么情况?也许我可以介入那里......

AbstractDetailFragment

public AbstractWISDetailFragment(ChooseData cData) {
        this.data = cData;
    }

@Override
    public void onViewCreated(View view, Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        setDetail();
        view.setClickable(true);
    }

protected abstract void setDetail();


ImplFragment

public ActorDetailFragment(ChooseData data) {
    super(data);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.akteur_detail, container, false);
    return view;
}
@Override
protected void setDetail() {
    // something
    ...
}


编辑:

从我触摸列表项以实例化详细信息片段的那一刻起,这是我的 logcat 条目:

I/InputReader(  305): dispatchTouch::touch event's action is 0, pending(waiting
finished signal)=0
I/InputDispatcher(  305): Delivering touch to current input target: action: 0, c
hannel '41a8fc30 ...ChooseActivity (server)'
I/InputDispatcher(  305): Delivering touch to current input target: action: 0, c
hannel 'TouchIntercepter (server)'
I/InputReader(  305): dispatchTouch::touch event's action is 1, pending(waiting
finished signal)=0
I/InputDispatcher(  305): Delivering touch to current input target: action: 1, c
hannel '41a8fc30 ...ChooseActivity (server)'
I/InputDispatcher(  305): Delivering touch to current input target: action: 1, c
hannel 'TouchIntercepter (server)'
D/WIS_ActorList( 2686): new actor item data set (process reseted)
D/WIS_ChooseActivity( 2686): ProcessButton enabled
D/WIS_ChooseActivity( 2686): ProcessStartButton disabled
D/WIS_ChooseActivity( 2686): ProcessStartButton disabled
D/HierarchicalStateMachine(  305): handleMessage: E msg.what=65619
D/HierarchicalStateMachine(  305): processMsg: ConnectedState
D/WifiStateMachine(  305): ConnectedState{ what=65619 when=-3ms arg1=4 }
D/HierarchicalStateMachine(  305): handleMessage: X
D/HierarchicalStateMachine(  305): handleMessage: E msg.what=65619
D/HierarchicalStateMachine(  305): processMsg: ConnectedState
D/WifiStateMachine(  305): ConnectedState{ what=65619 when=-3ms arg1=4 }
D/HierarchicalStateMachine(  305): handleMessage: X
D/dalvikvm( 2305): GC_EXPLICIT freed 329K, 9% free 6875K/7495K, paused 7ms+2ms
W/PowerManagerService(  305): Timer 0x3->0x3|0x1
D/HierarchicalStateMachine(  305): handleMessage: E msg.what=65619
D/HierarchicalStateMachine(  305): processMsg: ConnectedState
D/WifiStateMachine(  305): ConnectedState{ what=65619 when=-4ms arg1=4 }
D/HierarchicalStateMachine(  305): handleMessage: X
D/HierarchicalStateMachine(  305): handleMessage: E msg.what=65619
D/HierarchicalStateMachine(  305): processMsg: ConnectedState
D/WifiStateMachine(  305): ConnectedState{ what=65619 when=-4ms arg1=4 }
D/HierarchicalStateMachine(  305): handleMessage: X
D/HierarchicalStateMachine(  305): handleMessage: E msg.what=65619
D/HierarchicalStateMachine(  305): processMsg: ConnectedState
D/WifiStateMachine(  305): ConnectedState{ what=65619 when=-4ms arg1=4 }
D/HierarchicalStateMachine(  305): handleMessage: X

如果我拔掉设备 logcat 会自己死。

【问题讨论】:

  • 请附上logcat 好吗?拔掉插头崩溃是巧合-“出发休息室”中的usb连接器?
  • 我不认为这是巧合。拔下电源会重置正在运行的活动吗?我稍后会发布日志。
  • 看,logcat中没有足够的信息来查明问题的根源!
  • 会不会是activity被重置了,fragment还在管理器中。这样它可能会触发一个空指针,因为片段正在读取的数据对象不再存在!?有人知道吗?

标签: android crash usb


【解决方案1】:

显然,当拔下设备时,活动活动将恢复。如果 - 就我而言 - 您不使用 setArgument 并将 Bundles 传递到您的片段,就会出现问题。
因此,我有类似空指针的东西,因为我的片段无法重新初始化自身及其通过构造函数传递的数据对象。
Eclipse 告诉我不要使用非标准的构造函数。这样,通过参数的基本数据对象 exange 将无法正常工作。

解决方案:
只需与 Bundle 交换数据(这就是它的处理方式):

Bundle extra = new Bundle();
extra.putSerializable("myData" this.data);
Fragment fragment = new fragment ();
fragment.setArguments(extra);

tada - 一切正常。
如果您在所有活动和意图中牢记这一点,您就不会遇到任何麻烦。

高频

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多