Android 在URL获取完成时禁用进度条:标准场景
我有一个相当流行的场景,其中有一个包含进度条和ListView的片段。我想在使用改造获取数据后填充ListView。现在,一旦响应返回,进度条就需要不可见 当获取成功时,最好将Android 在URL获取完成时禁用进度条:标准场景,android,android-fragments,retrofit,Android,Android Fragments,Retrofit,我有一个相当流行的场景,其中有一个包含进度条和ListView的片段。我想在使用改造获取数据后填充ListView。现在,一旦响应返回,进度条就需要不可见 当获取成功时,最好将onCreateView()中膨胀的片段布局视图作为成员变量存储,并使用该变量禁用onResponse()(回调在onCreate()中创建)中的进度条 片段布局: <?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="htt
onCreateView()
中膨胀的片段布局视图作为成员变量存储,并使用该变量禁用onResponse()
(回调在onCreate()
中创建)中的进度条
片段布局:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/source_items_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp">
<com.gc.materialdesign.views.ProgressBarCircularIndeterminate
android:id="@+id/progress_bar"
android:layout_width="32dp"
android:layout_height="32dp"
android:background="#1E88E5"
android:layout_gravity="center_horizontal"/>
<ListView android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/source_list"/>
</FrameLayout>
谢谢最好在onCreateView()中初始化进度条,而不是使用view.findViewById(),因为这是一个昂贵的操作 我建议不要保留视图,而是将进度条作为成员变量,在fragment的ViewCreated上初始化它,然后用进度条变量做任何你想做的事情。我明白了。但是为什么呢?保留对视图的引用是否会占用更多内存?但它不是应该很轻吗?实际上在内存方面:是的,现在它几乎是一样的,但是假设您的xml中有一些新组件,那么它是内存密集型的,一旦触发onDestroyView of fragment,就会调用gc,当应用程序处于后台时,操作系统可能会因为内存不足而杀死你的应用程序。findViewById操作一点也不昂贵。它是一个由R.java和android生成的id,它维护一个哈希,其中有1对1的映射,因此理想情况下它的O(1)操作。@dex我认为它遍历视图层次结构,直到找到匹配的id。这就是为什么每次需要对视图进行引用时不建议这样做的原因。最好有一个局部变量,并在需要时使用它。你是说android store以树的形式存储视图可能是balance one,并且使用bfs或dfs进行遍历?如果可能的话,请分享相关链接。非常感谢您的澄清。但是从这里查看findViewById代码并没有给人留下这样的印象,即它具有某种树形式的视图,并且他们没有使用bfs或dfs来查找值。@dex它当然是一个树遍历。在您的链接中,“视图ID不必在整个树中都是唯一的,但最好确保它们至少在您正在搜索的树的部分中是唯一的。”
findViewById
调用是findViewTraversal
。您缺少的是View
s是树中的叶子,只要看一下,它就显示为O(1),但是ViewGroup
s(布局的父类)显示它递归地调用其所有子级的findViewById
。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mItemList = new ArrayList<SourceItem>();
RestClient.get().getSources().enqueue(new Callback<SourceItemList>() {
@Override
public void onResponse(Response<SourceItemList> response, Retrofit retrofit) {
if (response.isSuccess()) {
disableProgressBar();
//...
}
}
@Override
public void onFailure(Throwable t) {
disableProgressBar();
return;
}
private void disableProgressBar() {
if (mView != null) {
mView.findViewById(R.id.progress_bar).setVisibility(View.INVISIBLE);
}
}
});
// ...
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup viewGroup, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_sourceitem_list, viewGroup, false);
// ...
return mView;
}