私がいないリリースモードでは、ブレークポイントを設定した場合にのみ、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{...}}

しかし、動作しません。助けてください。ありがとうございました。

Teempy:

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

また、にアダプタを取り付ける考慮RecyclerViewonCreateViewはなく、中にonSuccessListener呼び出すnotifyDataSetChanged()ことに。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=410503&siteId=1