我有一個巨大的list
的Song
對象。每個對象包含4個Strings
(標題,專輯,藝術家,路徑)和integer
(album_id以稍後獲取專輯封面)。但是,我需要將此列表的一部分或甚至整個list
傳遞給將播放這些歌曲的新activity
。Android Java - 傳遞對象列表(內存浪費)
但是,是的,你是對的!這是很多的記憶!我通過僅傳遞路徑來減少它,並且在新活動的onCreate()
方法中,我將讀取設備上的所有歌曲,並在路徑匹配時將它們僅添加到播放列表。這仍然需要時間,並且可能比它應該更多的記憶。
怎樣才能減少內存使用量和時間,以便將歌曲的list
從一個活動轉移到另一個活動?
如果將路徑列表傳遞給新活動並通過其路徑讀取文件(直接)是一個好主意,我該怎麼做?到目前爲止,我有這個代碼,但效率不高。它將我們想要的播放列表中的文件的路徑列表作爲參數,並讀取外部存儲中的所有歌曲。那麼它會檢查每首歌曲的路徑是否在路徑列表中,否則它將繼續。
public static List<Song> getSongList(List<String> pathList, Context c) {
Cursor audioCursor = c.getContentResolver().query(
MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
new String[] { "*" }, null, null, Media.TITLE + " ASC");
ArrayList<Song> songsList = new ArrayList<Song>();
if (audioCursor != null) {
if (audioCursor.moveToFirst()) {
do {
String path = audioCursor.getString(audioCursor
.getColumnIndex(MediaStore.Audio.Media.DATA));
if(!pathList.contains(path)){
//if it's not in the list, we don't want it!
continue;
}
String title = audioCursor.getString(audioCursor
.getColumnIndex(MediaStore.Audio.Media.TITLE));
String album = audioCursor.getString(audioCursor
.getColumnIndex(MediaStore.Audio.Media.ALBUM));
String artist = audioCursor.getString(audioCursor
.getColumnIndex(MediaStore.Audio.Media.ARTIST));
int album_id = audioCursor.getInt(audioCursor.getColumnIndex(MediaStore.Audio.Media.ALBUM_ID));
Song s = new Song();
s.setPath(path);
s.setTitle(title);
s.setArtist(artist);
s.setAlbum(album);
s.setAlbumId(album_id);
songsList.add(s);
} while (audioCursor.moveToNext());
}
}
// return songs list array
return songsList;
}
我會建議使用單例,比如'SongStore'或類似的。有些人可能會不同意。 – ChiefTwoPencils
您可以使用進度條將列表加載到您的活動中。 – penkzhou
有很多方法,在我看來,單身人士是一種(不壞)的方法。 –