gpt4 book ai didi

java - Android 中广播接收器的奇怪问题

转载 作者:行者123 更新时间:2023-12-01 19:22:30 25 4
gpt4 key购买 nike

我只有这段代码,非常简单。我有一个列表,在 onCreate 方法中我向该列表添加了一些对象以将它们显示在屏幕上。我有一个广播接收器,当没有互联网连接时,它必须启用/禁用列表中的某些元素。

如果当应用程序已在此 Activity 的屏幕中时连接丢失,广播接收器可以正常工作。问题是在进入此 Activity 之前没有连接。在这种情况下,在 onresume() 中调用 oncreate() 方法后,接收器已注册,但是当我在接收器内调用 getListView() 时,它没有任何子级(尽管我已在 oncreate 方法中添加到适配器,并且我根本没有使用任何线程加载)。

谁能告诉我为什么会这样?

public class MyActivity extends ListActivity {
private List<MyClass> myObjects;

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

//check if internet connection is available
boolean networkAvailable = ... ;
if (!networkAvailable) {
//No Internet connection: disabled non-cached objects
List<MyClass> cachedObjects = getCachedObjects();
for(int i = 0; i<myObjects.size(); i++){
MyClass myObject = myObjects.get(i);
if (!cachedSurveys.contains(myObject)) {
ListView listView = getListView();
//The problem is here: listView is empty when there was no connection
//before creating the activity so the broadcast receiver was called in a sticky way
View child = listView.getChildAt(i);
child.setEnabled(false);

}
}
} else {
// Internet connection: enable all myObjects
int size = getListView().getChildCount();
for (int i = 0; i < size; i++) {
View child = getListView().getChildAt(i);
child.setEnabled(true);
}
}
}
};

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

myObjects = getMyObjects();

setListAdapter(new ArrayAdapter<MyClass>(this, android.R.layout.simple_list_item_1, myObjects));
getListView().setTextFilterEnabled(true);
}

@Override
protected void onResume() {
super.onResume();
IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(receiver, intentFilter);
}

@Override
protected void onPause() {
super.onPause();
unregisterReceiver(receiver);
}
}

谢谢

最佳答案

首先,我认为我们应该了解一些事实:

  • Activity 将在调用 onResume() 方法后开始绘制其内容,但不是“紧接着”调用
  • 调用ListView.setListAdapter(...)后,ListView只存储适配器对象,此时,没有 subview 。
  • ListView 在屏幕上绘制该 subview 后(调用 Adapter.getView() 后), subview 将可用,并且每次 ListView 添加一个 subview 时, subview 列表都会逐一增加,直到 ListView 绘制它们一切都在屏幕上。

对于您的代码,您无法在 Activity 第一次启动时获取 subview 列表的原因是“ListView 尚未在屏幕上绘制任何内容”。因为接收者的onReceive()方法是在ListView绘制之前触发的。

您可以通过覆盖适配器自行检查并显示日志以查看调用这些方法的顺序。这是我的结果:

07-30 23:06:03.231: DEBUG/MyActivity(386): onResume 1280505963237   
07-30 23:06:03.281: DEBUG/MyActivity(386): onReceive 1280505963281
07-30 23:06:03.361: DEBUG/MyActivity(386): getView 0 1280505963371
07-30 23:06:03.381: DEBUG/MyActivity(386): getView 1 1280505963386

希望我的回答可以帮助到您!

关于java - Android 中广播接收器的奇怪问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3369922/

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