gpt4 book ai didi

Java代码仅在我设置断点时工作,而不是在 Release模式下工作

转载 作者:行者123 更新时间:2023-12-01 17:36:23 24 4
gpt4 key购买 nike

我必须在 fragment 的回收器 View 中显示用户列表。代码很好,但当我运行应用程序时,列表没有显示。

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() 返回某种 promise 的集合,并且您的 apply(Document doc) 是异步回调。这意味着您的 userAdapter 始终是用空数组构造的。

但它可以在 Debug模式下工作,因为当您单击适配器构造行上的“Step”按钮时,异步回调已经工作并返回值。

找不到它的文档(它是否存在?),所以我将其添加到项目中,发现您可以将 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);
}
});

此外,请考虑在 onCreateView 中将适配器附加到 RecyclerView,但在 onSuccessListener 中调用 notifyDataSetChanged()它。

关于Java代码仅在我设置断点时工作,而不是在 Release模式下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61031977/

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