首页 > 解决方案 > 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{...}}

但不起作用。请帮忙。谢谢你。

标签: javaandroidandroid-fragmentsandroid-recyclerview

解决方案


没有使用 MongoDB,但它似乎db.find()返回了某种承诺的集合,并且你apply(Document doc)是异步回调。这意味着您的 userAdapter 始终使用空数组构造。

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

找不到它的文档(它甚至存在吗?),所以我将它添加到项目中,发现您可以添加OnCompleteListenerRemoteFindIterable. 那应该是制作适配器的地方。

        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);
            }
        });

另外,考虑将适配器附加到RecyclerViewin onCreateView,但在onSuccessListener调用notifyDataSetChanged()它时。


推荐阅读