(listAdapter 作为 WiFiPeerListAdapter).notifyDataSetChanged() 导致崩溃

问题描述 投票:0回答:1
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    listAdapter = WiFiPeerListAdapter(requireContext(), R.layout.row_devices, peers)
}

在投射时导致崩溃,如下所示:

   fun clearPeers() {
    peers.clear()
    (listAdapter as WiFiPeerListAdapter).notifyDataSetChanged()
}

这里的列表适配器是ListFragment()类中的setListAdapter():

  public void setListAdapter(@Nullable ListAdapter adapter) {
    boolean hadAdapter = mAdapter != null;
    mAdapter = adapter;
    if (mList != null) {
        mList.setAdapter(adapter);
        if (!mListShown && !hadAdapter) {
            // The list was hidden, and previously didn't have an
            // adapter.  It is now time to show it.
            setListShown(true, requireView().getWindowToken() != null);
        }
    }
}

崩溃报告:

致命异常:主要 进程:com.tsfapps.wifip2p,PID:29222 java.lang.RuntimeException:在 com.tsfapps.wifip2p.WiFiDirectBroadcastReceiver@b154cba 中接收广播 Intent { act=android.net.wifi.p2p.CONNECTION_STATE_CHANGE flg=0x24000010 (has extras) } 时出错 在 android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1689) 在 android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(未知来源:2) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.app.ActivityThread.main(ActivityThread.java:7839) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003) 引起原因:java.lang.NullPointerException:null无法转换为非空类型com.tsfapps.wifip2p.DeviceListFragment.WiFiPeerListAdapter 在com.tsfapps.wifip2p.DeviceListFragment.clearPeers(DeviceListFragment.kt:102) 在com.tsfapps.wifip2p.MainActivity.resetData(MainActivity.kt:159) 在com.tsfapps.wifip2p.WiFiDirectBroadcastReceiver.onReceive(WiFiDirectBroadcastReceiver.kt:77) 在 android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0$LoadedApk$ReceiverDispatcher$Args(LoadedApk.java:1679) 在 android.app.LoadedApk$ReceiverDispatcher$Args$$ExternalSyntheticLambda0.run(未知来源:2) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loopOnce(Looper.java:201) 在 android.os.Looper.loop(Looper.java:288) 在 android.app.ActivityThread.main(ActivityThread.java:7839) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1003)

我尝试在Goolge中搜索,但没有得到任何合适的解决方案

android wifi-direct
1个回答
0
投票

您遇到的崩溃是由将 listAdapter 转换为 WifiPeerListAdaptor 时的 NullPointerException 引起的。发生异常是因为在强制转换时listAdapter为null。

要修复崩溃,请在调用clearPeer()函数之前正确初始化listAdapter。

这是一个例子

private lateinit var listAdapter: WiFiPeerListAdapter 

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    listAdapter = WiFiPeerListAdapter(requireContext(), R.layout.row_devices, peers)

    // Other code...
}

fun clearPeers() {
    peers.clear()

    // Check if listAdapter is initialized

    if (::listAdapter.isInitialized) { 
        listAdapter.notifyDataSetChanged()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.