gpt4 book ai didi

android - 更新从广播接收器调用的 ListView 的方法不起作用

转载 作者:行者123 更新时间:2023-11-29 14:14:43 25 4
gpt4 key购买 nike

我在实现广播接收器时遇到了问题。

我在 Fragment 类中有这个函数:

public void reloadMessages() {
List<SmsList> values = smsToSmsList(getAllSms());
mPostAdapter.clear();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
mPostAdapter.addAll(values);
} else {
for (SmsList smsList : values) {
mPostAdapter.add(smsList);
}
}
mPostAdapter.notifyDataSetChanged();
Log.d(null, "reloadMessages");
}

我从广播接收器调用它:

private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {

mainFragment.reloadMessages();

Log.d("myactivity", "broadcast received");
}
};

用调试器分析表明这个函数被正确调用,但没有任何反应。我进行了测试并从 onclick 函数中调用了该函数,它工作正常。

问题是什么?

我尝试使用 runOnUiThread() 和 Handler,但没有任何变化。

最佳答案

在 API 级别 11 之前,您不能在 onReceive() 方法中执行任何异步操作,因为一旦 onReceive() 方法完成,Android 系统就可以回收该组件。如果您有可能长时间运行的操作,则应改为触发服务。

从 Android API 11 开始,您可以调用 goAsync() 方法。此方法返回一个 PendingResult 类型的对象。 Android 系统认为接收器处于 Activity 状态,直到您对该对象调用 PendingResult.finish() 为止。使用此选项,您可以在接收器中触发异步处理。

您需要做的是启动一个服务,该服务将在广播事件时执行此类操作:

new BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Intent intent = new Intent(context, CustomService.class);
context.startService(intent);
}
}

编辑:

您可能遗漏了一些关于此事的信息,例如正确声明有关广播接收和服务的 xml 组件和权限。

我强烈推荐你关注this教程,因为它会让您了解这些是如何工作的。

关于android - 更新从广播接收器调用的 ListView 的方法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25093421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com