java - Java代码仅在我设置断点时工作,而不是在发布模式下
问题描述
我必须在片段的回收站视图中显示用户列表。代码很好,但是当我运行应用程序时列表没有显示。
package com.example.demo;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.demo.Model.User;
import com.mongodb.Block;
import com.mongodb.DBObject;
import com.mongodb.stitch.android.core.Stitch;
import com.mongodb.stitch.android.core.StitchAppClient;
import com.mongodb.stitch.android.services.mongodb.remote.RemoteFindIterable;
import com.mongodb.stitch.android.services.mongodb.remote.RemoteMongoClient;
import com.mongodb.stitch.android.services.mongodb.remote.RemoteMongoCollection;
import com.mongodb.stitch.android.services.mongodb.remote.RemoteMongoCursor;
import org.bson.Document;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.concurrent.TimeUnit;
public class UsersFragment extends Fragment {
private RecyclerView recyclerView;
private UserAdapter userAdapter = null;
private List<User> mUsers = null;
private String username;
private String imageURL;
@Override
public View onCreateView( LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fargment_users,container,false);
recyclerView = view.findViewById(R.id.recycler_view);
StitchAppClient stitchAppClient = Stitch.getDefaultAppClient();
RemoteMongoClient client = stitchAppClient.getServiceClient(RemoteMongoClient.factory,"mongodb-atlas");
RemoteMongoCollection db = client.getDatabase("db").getCollection("Users");
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
mUsers = new ArrayList<>();
mUsers.clear();
try {
readUsers();
} catch (InterruptedException e) {
e.printStackTrace();
}
return view;
}
private void readUsers() throws InterruptedException {
StitchAppClient stitchAppClient = Stitch.getDefaultAppClient();
RemoteMongoClient client = stitchAppClient.getServiceClient(RemoteMongoClient.factory, "mongodb-atlas");
RemoteMongoCollection db = client.getDatabase("db").getCollection("Users");
RemoteFindIterable docs = db.find();
docs.forEach(new Block<Document>() {
@Override
public void apply(Document document) {
username = document.getString("username");
imageURL = document.getString("imageURL");
Log.d("rrrrrrrr", "apply: " + username + imageURL);
User user = new User(username, imageURL);
mUsers.add(user);
Log.d("rrrrrrrr", "apply: " + mUsers);
}
});
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
}
}
然后我尝试调试代码并在这些行上放置一个断点
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
名单出现了。我不知道发生了什么,所以我删除了断点并且代码不起作用。然后我尝试在
username = document.getString("username");
我在每一行都运行它,我发现它永远不会进入上面提到的那些行。列表仍然没有显示。我试着把
Thread.yield();
字里行间,但没有任何效果。我什至试图把这些线放在
getActivity.runOnUiThread(){new Runnable{...}}
但不起作用。请帮忙。谢谢你。
解决方案
没有使用 MongoDB,但它似乎db.find()
返回了某种承诺的集合,并且你apply(Document doc)
是异步回调。这意味着您的 userAdapter 始终使用空数组构造。
但它在调试模式下工作,因为当您单击适配器构造行上的“步骤”按钮时,异步回调已经工作并返回值。
找不到它的文档(它甚至存在吗?),所以我将它添加到项目中,发现您可以添加OnCompleteListener
到RemoteFindIterable
. 那应该是制作适配器的地方。
docs.forEach(new Block<Document>() {
@Override
public void apply(Document document) {
username = document.getString("username");
imageURL = document.getString("imageURL");
User user = new User(username, imageURL);
mUsers.add(user);
}
}).addOnSuccessListener(new OnSuccessListener() {
@Override
public void onSuccess(Object o) {
userAdapter = new UserAdapter(getContext(), mUsers);
recyclerView.setAdapter(userAdapter);
}
});
另外,考虑将适配器附加到RecyclerView
in onCreateView
,但在onSuccessListener
调用notifyDataSetChanged()
它时。
推荐阅读
- c++ - 调试断言失败:向量下标超出范围
- angular - Angular 前端 CRUD 和后端 CRUD 的区别
- php - SQLi - 什么是最安全的?
- python - VSC 不导入已安装的 python 库
- drake - 关于德雷克当前逆运动学代码的问题
- react-admin - 根据列值隐藏Datagrid中的行
- mysql - MySql 用like 选择并根据找到的子字符串的数量给出权重
- jquery - Zurb Foundation 6:手风琴菜单打开时触发事件?
- reactjs - 导入后备组件时 React Suspense 不起作用
- mysql - MySQL 中按月发送的首次电子邮件计数