Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在解析查询中初始化或修改变量_Java_Android_Parse Server - Fatal编程技术网

Java 在解析查询中初始化或修改变量

Java 在解析查询中初始化或修改变量,java,android,parse-server,Java,Android,Parse Server,我创建了一个名为“Roommate”的类,该类是使用ParseUser变量构造的,我试图创建一个新的Roommate对象并将其添加到Roommate arrayList中。但是,在查询完成后,我所做的任何修改或初始化似乎都会重置。一旦查询完成,我的arrayList就会变成空的。有人知道这是为什么吗?我能做些什么来回避这个问题 如果这是一个基本问题,我很抱歉。我是一名学生,这是我第一次尝试制作应用程序。感谢所有反馈 ArrayList和OnCreate方法,在其中调用updateRoommate

我创建了一个名为“Roommate”的类,该类是使用ParseUser变量构造的,我试图创建一个新的Roommate对象并将其添加到Roommate arrayList中。但是,在查询完成后,我所做的任何修改或初始化似乎都会重置。一旦查询完成,我的arrayList就会变成空的。有人知道这是为什么吗?我能做些什么来回避这个问题

如果这是一个基本问题,我很抱歉。我是一名学生,这是我第一次尝试制作应用程序。感谢所有反馈

ArrayList和OnCreate方法,在其中调用updateRoommatesArray():

//变量
私人ArrayList室友=新建ArrayList();
AddRoomMatereCyclerServiceAdapter适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u add\u室友);
//设置工具栏
Toolbar myToolbar=(Toolbar)findViewById(R.id.my\u Toolbar\u室友);
设置支持操作栏(myToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setTitle(“添加室友”);
//设置浮动操作按钮
FloatingActionButton fab=findViewById(R.id.fab);
fab.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//单击时显示对话框
AddRoommatesDialog AddRoommatesDialog=新建AddRoommatesDialog();
显示(getSupportFragmentManager(),“添加室友对话框”);
}
});
//使用Parse中的数据初始化roommateNames
updateRoommatesArray();
Toast.makeText(this,Integer.toString(roommates.size()),Toast.LENGTH\u SHORT.show();
//设置回收器视图
LinearLayoutManager layoutManager=新的LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
RecyclerView RecyclerView=findViewById(R.id.rm\u recycler);
recyclerView.setLayoutManager(layoutManager);
adapter=newaddRoomMatereCyclerServiceAdapter(这是室友);
recyclerView.setAdapter(适配器);
}
updateRoommatesArray方法:

public void updateRoommatesArray() {
    roommates.clear();
    final ParseUser currentUser = ParseUser.getCurrentUser();
    ParseRelation<ParseUser> relation = currentUser.getRelation("roommates");
    relation.getQuery().findInBackground(new FindCallback<ParseUser>() {
        @Override
        public void done(List<ParseUser> objects, ParseException e) {
            if (e == null && objects.size() > 0) {
                for (ParseUser roommate : objects) {
                    Roommate current_roommate = new Roommate(roommate);
                    roommates.add(current_roommate);
                }
            }
            else {
                Log.i("Query", "Empty or Not Working");
            }
        }
    });
}
public void updateRoommatesArray(){
室友们;
final ParseUser currentUser=ParseUser.getCurrentUser();
ParseRelation=currentUser.getRelation(“室友”);
relation.getQuery().findInBackground(新的FindCallback()){
@凌驾
公共void done(列出对象,parsee异常){
如果(e==null&&objects.size()>0){
用于(用户室友:对象){
室友当前室友=新室友(室友);
室友。添加(当前室友);
}
}
否则{
Log.i(“查询”、“空或不工作”);
}
}
});
}
室友班:

public class Roommate {

// Member Variables
String objectId;
String username;
String firstName;
String lastName;
String fullName;
ArrayList<Roommate> roommates;


// Constructor
public Roommate(ParseUser user_in) {
    objectId = user_in.getObjectId().toString();
    username = user_in.getUsername().toString();
    firstName = user_in.get("firstName").toString();
    lastName = user_in.get("lastName").toString();
    fullName = firstName + " " + lastName;
    roommates = new ArrayList<>();
}


public String getObjectId() {
    return objectId;
}

public String getUsername() {
    return username;
}

public String getFirstName() {
    return firstName;
}

public String getLastName() {
    return lastName;
}

public String getFullName() {
    return fullName;
}

public ArrayList<Roommate> getRoommates() {
    return roommates;
}
}
公共课室友{
//成员变量
字符串objectId;
字符串用户名;
字符串名;
字符串lastName;
字符串全名;
ArrayList室友;
//建造师
公共室友(ParseUser_in){
objectId=user_in.getObjectId().toString();
username=user_in.getUsername().toString();
firstName=user_in.get(“firstName”).toString();
lastName=user_in.get(“lastName”).toString();
fullName=firstName+“”+lastName;
室友=新ArrayList();
}
公共字符串getObjectId(){
返回objectId;
}
公共字符串getUsername(){
返回用户名;
}
公共字符串getFirstName(){
返回名字;
}
公共字符串getLastName(){
返回姓氏;
}
公共字符串getFullName(){
返回全名;
}
公共阵列列表getRoommates(){
返回室友;
}
}

问题刚刚出现,因为findInBackground()方法是异步方法调用。无法保证在终止findInBackground的作业后将执行设置RecyclerAdaptor的适配器

请注意,您在updateRoommatesArray的第一行中清楚地列出了列表。然后启动一个异步任务。之后,主线程希望继续它的工作,并返回onCreate()方法来设置ArrayList。它将无限期地发生

从本质上讲,从数据库加载数据比在主线程中执行简单代码需要更长的时间

所以很可能是recyclerView.setAdapter(adapter);将在完成()方法内填充数组之前执行

为了确保适配器将被填充,请将以下代码放入done方法中。通过这样做,您将保证正确的代码执行顺序

Toast.makeText(this,Integer.toString(roommates.size()),Toast.LENGTH\u SHORT.show();
//设置回收器视图
LinearLayoutManager layoutManager=新的LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);
RecyclerView RecyclerView=findViewById(R.id.rm\u recycler);
recyclerView.setLayoutManager(layoutManager);
adapter=newaddRoomMatereCyclerServiceAdapter(这是室友);

recyclerView.setAdapter(适配器)谢谢,这很有道理。如果我不能确定findInBackground()方法何时完成,是否有任何方法可以在另一个函数中访问roommates arrayList中存储的值?如果您熟悉EDA,可以在主线程下运行的Desired subscriber中引发事件并捕获它,请参阅GreenRobot EventBus。在任何senario中,都必须确保填充RecyclerAdapter的调用方法必须在done()方法完成其工作后发生。这完全是并发问题,你必须小心
public class Roommate {

// Member Variables
String objectId;
String username;
String firstName;
String lastName;
String fullName;
ArrayList<Roommate> roommates;


// Constructor
public Roommate(ParseUser user_in) {
    objectId = user_in.getObjectId().toString();
    username = user_in.getUsername().toString();
    firstName = user_in.get("firstName").toString();
    lastName = user_in.get("lastName").toString();
    fullName = firstName + " " + lastName;
    roommates = new ArrayList<>();
}


public String getObjectId() {
    return objectId;
}

public String getUsername() {
    return username;
}

public String getFirstName() {
    return firstName;
}

public String getLastName() {
    return lastName;
}

public String getFullName() {
    return fullName;
}

public ArrayList<Roommate> getRoommates() {
    return roommates;
}
}