Android | arraylist.size() 即使声明为全局变量也返回 0?
Android | arraylist.size() returning 0 even if it is declared as global variable?
我有一个方法可以获取所有图像 uri 并将其存储到 arrayList
。它在任何方法声明之前被声明为全局变量。它有一个 while 循环,它获取图像直到 cursor
有下一个条目。当没有剩余项目时,while 循环终止。在 while 循环内 arrayList.size()
returns 4 这是预期的,因为我的设备只有 4 张照片。但是,在 while 循环之外它 returns 0。我不明白为什么。
...
public ArrayList<ImageModel> fetchImages() {
imageModel = new ImageModel();
if(!FETCHED || !previousList.equals(arrayList)) {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
projection = new String[]{MediaStore.Images.Media._ID,MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
orderBy = MediaStore.Images.Media.DATE_ADDED;
cursor = activity.getApplicationContext().getContentResolver().query(uri, projection, null, null, orderBy + " DESC");
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID);
new Thread(() -> {
while (cursor.moveToNext()) { //Start of while loop....
Log.d("FetchImages(): ", " Started");
long mediaId = cursor.getLong(column_index_data);
name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME));
if (!list.contains(name))
list.add(name);
Uri uriMedia = Uri.withAppendedPath(uri, "" + mediaId);
imageModel.setUri(uriMedia);
arrayList.add(imageModel);
}// End of while loop
cursor.close();
Log.d("FetchImages(): ", " Ended");
Log.d("FetchAlbums(): ", " Ended with list size "+list.size());
Log.d("Inside of While", "fetchImages: "+arrayList.size()); //returns 4
}).start();
FETCHED = true;
previousList = arrayList;
}
Log.d("Out of While", "fetchImages: "+arrayList.size()); // returns 0
return arrayList;
}
...
变量数组在顶部声明。
public class FetchImages {
private static ArrayList<ImageModel> arrayList;
private static ArrayList<String> list;
...
同样的事情发生在另一个 arraylist 变量 list
。
此类问题是由于线程的不同步行为引起的。避免使用过多线程。
线程不共享变量的单个副本。所以,在 while loop
它有自己的变量,其中主变量是 0.
我有一个方法可以获取所有图像 uri 并将其存储到 arrayList
。它在任何方法声明之前被声明为全局变量。它有一个 while 循环,它获取图像直到 cursor
有下一个条目。当没有剩余项目时,while 循环终止。在 while 循环内 arrayList.size()
returns 4 这是预期的,因为我的设备只有 4 张照片。但是,在 while 循环之外它 returns 0。我不明白为什么。
...
public ArrayList<ImageModel> fetchImages() {
imageModel = new ImageModel();
if(!FETCHED || !previousList.equals(arrayList)) {
uri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;
projection = new String[]{MediaStore.Images.Media._ID,MediaStore.Images.Media.BUCKET_DISPLAY_NAME};
orderBy = MediaStore.Images.Media.DATE_ADDED;
cursor = activity.getApplicationContext().getContentResolver().query(uri, projection, null, null, orderBy + " DESC");
column_index_data = cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID);
new Thread(() -> {
while (cursor.moveToNext()) { //Start of while loop....
Log.d("FetchImages(): ", " Started");
long mediaId = cursor.getLong(column_index_data);
name = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Images.Media.BUCKET_DISPLAY_NAME));
if (!list.contains(name))
list.add(name);
Uri uriMedia = Uri.withAppendedPath(uri, "" + mediaId);
imageModel.setUri(uriMedia);
arrayList.add(imageModel);
}// End of while loop
cursor.close();
Log.d("FetchImages(): ", " Ended");
Log.d("FetchAlbums(): ", " Ended with list size "+list.size());
Log.d("Inside of While", "fetchImages: "+arrayList.size()); //returns 4
}).start();
FETCHED = true;
previousList = arrayList;
}
Log.d("Out of While", "fetchImages: "+arrayList.size()); // returns 0
return arrayList;
}
...
变量数组在顶部声明。
public class FetchImages {
private static ArrayList<ImageModel> arrayList;
private static ArrayList<String> list;
...
同样的事情发生在另一个 arraylist 变量 list
。
此类问题是由于线程的不同步行为引起的。避免使用过多线程。
线程不共享变量的单个副本。所以,在 while loop
它有自己的变量,其中主变量是 0.