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