我想在下面的代码中声明的三个ArrayLists
中添加元素,但我似乎遇到了与变量范围相关的一些问题。 免责声明:我是Java的新手,可能只是因为我做的事非常愚蠢。另请注意,我正在使用Parse Android API。 (我在代码中添加了一些注释,以便更好地突出我正在尝试解决的问题)。谢谢!
public class MatchesActivity extends Activity implements OnItemClickListener {
ArrayList<String> titles = new ArrayList<String>();
ArrayList<String> descriptions = new ArrayList<String>();
ArrayList<Bitmap> images = new ArrayList<Bitmap>();
String school;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.matches_layout);
ParseQuery query = new ParseQuery("Profile");
query.whereEqualTo("userName", ParseUser.getCurrentUser().getUsername().toString());
query.getFirstInBackground(new GetCallback() {
public void done(ParseObject obj, ParseException e) {
if (e == null) {
school = obj.getString("school");
ParseQuery query2 = new ParseQuery("Profile");
query2.whereEqualTo("school", school);
query2.findInBackground(new FindCallback() {
public void done(List<ParseObject> scoreList, ParseException e) {
if (e == null) {
// scoreList.size() == 3 here
for (int i = 0; i < scoreList.size(); i++){
titles.add(scoreList.get(i).getString("fullName"));
descriptions.add(scoreList.get(i).getString("sentence"));
ParseFile profileImg = (ParseFile) scoreList.get(i).get("pic");
try {
profileImg.getDataInBackground(new GetDataCallback() {
public void done(byte[] data, ParseException e) {
if (e == null) {
Bitmap bMap = BitmapFactory.decodeByteArray(data, 0,data.length);
images.add(bMap);
} else {
Toast.makeText(getApplicationContext(),"Error: " + e.getMessage(),Toast.LENGTH_SHORT).show();
}
// AT THIS POINT THE ARRAYLIST "IMAGES" IS BEING ASSIGNED VALUES
}
});
} catch (NullPointerException npe) {
images.add(BitmapFactory.decodeResource(getResources(), R.drawable.ic_prof));
}
}
// HERE, THE SIZE OF TITLES AND DESCRIPTION IS 3, HOWEVER, IMAGES HAS NO ELEMENTS (WHEN I EXPECTED IT TO HAVE 3)
} else {
Toast.makeText(getApplicationContext(),"Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
} else {
Toast.makeText(getApplicationContext(),"Error: " + e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
});
// ALL LISTS ARE EMPTY AT THIS POINT (BUT I WOULD LIKE TO USE THEM HERE)
}
问题解决了:
由于它是由 Yogendra Singh 和 twaddington 提出的,getDataInBackground
方法作为辅助线程运行,在我到达之前没有机会完成我的代码中的特定位置,我需要在那里检索信息。由于我的最终任务是使用从我的Parse数据库中检索到的信息动态填充listView,我只是决定遵循提示here并在getDataInBackground
内完成所有操作。那很有效!谢谢大家的帮助。
答案 0 :(得分:1)
您已将列表声明为Class member attributes
。可以在类的任何非静态方法中直接访问这些属性。你在onCreate
方法中使用它们很好。
一个天文台说明:您可能希望将变量定义为private
。
您可能还有其他一些与变量范围相关的问题。如果您认为存在问题,请分享所观察到的具体问题。
编辑:正如所怀疑的,此问题是由于列表在后台填充。 当它到达最后一行(打印尺寸)时,很可能还没有填充列表。
请注意: A GetCallback is used to run code after a ParseQuery is used to fetch a ParseObject in a background thread.
这意味着GetCallBack正在运行后台(异步模式)。