从外部方法将值分配给字段(“全局变量”)

时间:2012-11-05 01:10:03

标签: java android

我想在下面的代码中声明的三个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内完成所有操作。那很有效!谢谢大家的帮助。

1 个答案:

答案 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正在运行后台(异步模式)。