Android|arraylist.size()即使声明为全局变量也返回0



我有一个方法来获取所有图像uri并将其存储到arrayList中。它在任何方法声明之前都被声明为全局变量。它有一个while循环,用于获取图像,直到cursor有下一个条目。而循环在没有剩余项目时终止。在while循环中,arrayList.size()返回4,这是预期的,因为我的设备只有4张照片。但是,在while循环之外,它返回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;
...

同样的事情也发生在另一个数组列表变量list上。

这类问题是由于线程的不同步行为引起的。避免使用过多的线程。

线程不共享变量的单个副本。因此,在while loop中,它有自己的变量,其中主变量为0。

相关内容

  • 没有找到相关文章

最新更新