In my app I'm trying to extract album arts from all music files in phone storage and then I populate them into my RecyclerView
. I'm successfully getting everything but still it's taking a lot of time for all tracks to get rendered into my RecyclerView
. All I want to do is as soon as my app is launched all tracks should be filled up in RecyclerView
instantly with appropriate album art without any delay. I tried to put my code into coroutines but still it is taking a lot of delay. Any help will be appreciated.
fun getSongList() = GlobalScope.launch(Dispatchers.IO)
{
async {
realm = Realm.getDefaultInstance()
val iterator = FileUtils.iterateFiles(
Environment.getExternalStorageDirectory(),
FileFilterUtils.suffixFileFilter("m4a"),
TrueFileFilter.INSTANCE)
while (iterator.hasNext()) {
try {
val fileINeed = iterator.next()
val thisurls = fileINeed.canonicalPath
val mmr = MediaMetadataRetriever()
mmr.setDataSource(thisurls)
var thisTitle = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)
var thisArtist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)
if (thisTitle.isNullOrEmpty()) {
thisTitle = fileINeed.name
}
if (thisArtist.isNullOrEmpty()) {
thisArtist = "Unknown Artist"
}
val query = realm!!.where(Songdetails::class.java).equalTo("songname",thisTitle).findFirst()
if(query == null)
{
val retriever = MediaMetadataRetriever()
retriever.setDataSource(thisurls)
val art = retriever.embeddedPicture
if (art != null) {
var bitmap = BitmapFactory.decodeByteArray(art, 0, art.size)
ImageSaver(MainActivity.getInstance()!!)
.setFileName(thisTitle)
.setDirectoryName("images")
.save(bitmap)
realm = Realm.getDefaultInstance()
realm!!.executeTransaction(object : Realm.Transaction {
override fun execute(realm: Realm) {
// increment index
var num = realm.where(Songdetails::class.java).max("id")
var nextID: Int
if (num == null) {
nextID = 1
} else {
nextID = num.toInt() + 1
}
var songitem = realm!!.createObject(Songdetails::class.java, nextID)
songitem.songname = thisTitle
songitem.songartist = thisArtist
songitem.songurl = thisurls
songitem.songimage = thisTitle
EventBus.getDefault().post("update")
}
})
}
else{
realm = Realm.getDefaultInstance()
realm!!.executeTransaction(object : Realm.Transaction {
override fun execute(realm: Realm) {
// increment index
var num = realm.where(Songdetails::class.java).max("id")
var nextID: Int
if (num == null) {
nextID = 1
} else {
nextID = num.toInt() + 1
}
var songitem = realm!!.createObject(Songdetails::class.java, nextID)
songitem.songname = thisTitle
songitem.songartist = thisArtist
songitem.songurl = thisurls
songitem.songimage = "custom"
EventBus.getDefault().post("update")
}
})
}
}
}catch (ex:Exception)
{
}
}
realm = Realm.getDefaultInstance()
val mp3iterator = FileUtils.iterateFiles(
Environment.getExternalStorageDirectory(),
FileFilterUtils.suffixFileFilter("mp3"),
TrueFileFilter.INSTANCE)
while (mp3iterator.hasNext()) {
try {
val fileINeed = mp3iterator.next()
val thisurls = fileINeed.canonicalPath
val mmr = MediaMetadataRetriever()
mmr.setDataSource(thisurls)
var thisTitle = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)
var thisArtist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)
if (!thisTitle.isNullOrEmpty()) {
val query = realm!!.where(Songdetails::class.java).equalTo("songname", thisTitle).findFirst()
if (query == null) {
val retriever = MediaMetadataRetriever()
retriever.setDataSource(thisurls)
val art = retriever.embeddedPicture
if (art != null) {
var bitmap = BitmapFactory.decodeByteArray(art, 0, art.size)
ImageSaver(MainActivity.getInstance()!!)
.setFileName(thisTitle)
.setDirectoryName("images")
.save(bitmap)
realm = Realm.getDefaultInstance()
realm!!.executeTransaction(object : Realm.Transaction {
override fun execute(realm: Realm) {
// increment index
var num = realm.where(Songdetails::class.java).max("id")
var nextID: Int
if (num == null) {
nextID = 1
} else {
nextID = num.toInt() + 1
}
var songitem = realm!!.createObject(Songdetails::class.java, nextID)
songitem.songname = thisTitle
songitem.songartist = thisArtist
songitem.songurl = thisurls
songitem.songimage = thisTitle
EventBus.getDefault().post("update")
}
})
}
else{
realm = Realm.getDefaultInstance()
realm!!.executeTransaction(object : Realm.Transaction {
override fun execute(realm: Realm) {
// increment index
var num = realm.where(Songdetails::class.java).max("id")
var nextID: Int
if (num == null) {
nextID = 1
} else {
nextID = num.toInt() + 1
}
var songitem = realm!!.createObject(Songdetails::class.java, nextID)
songitem.songname = thisTitle
songitem.songartist = thisArtist
songitem.songurl = thisurls
songitem.songimage = "custom"
EventBus.getDefault().post("update")
}
})
}
}
}
}catch (ex:Exception)
{
}
}
realm = Realm.getDefaultInstance()
val waviterator = FileUtils.iterateFiles(
Environment.getExternalStorageDirectory(),
FileFilterUtils.suffixFileFilter("wav"),
TrueFileFilter.INSTANCE)
while (waviterator.hasNext()) {
try {
val fileINeed = waviterator.next()
val thisurls = fileINeed.canonicalPath
val mmr = MediaMetadataRetriever()
mmr.setDataSource(thisurls)
var thisTitle = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_TITLE)
var thisArtist = mmr.extractMetadata(MediaMetadataRetriever.METADATA_KEY_ARTIST)
if (thisTitle.isNullOrEmpty()) {
thisTitle = fileINeed.name
}
if (thisArtist.isNullOrEmpty()) {
thisArtist = "Unknown Artist"
}
val query = realm!!.where(Songdetails::class.java).equalTo("songname", thisTitle).findFirst()
if (query == null) {
val retriever = MediaMetadataRetriever()
retriever.setDataSource(thisurls)
val art = retriever.embeddedPicture
if (art != null) {
var bitmap = BitmapFactory.decodeByteArray(art, 0, art.size)
ImageSaver(MainActivity.getInstance()!!)
.setFileName(thisTitle)
.setDirectoryName("images")
.save(bitmap)
realm = Realm.getDefaultInstance()
realm!!.executeTransaction(object : Realm.Transaction {
override fun execute(realm: Realm) {
// increment index
var num = realm.where(Songdetails::class.java).max("id")
var nextID: Int
if (num == null) {
nextID = 1
} else {
nextID = num.toInt() + 1
}
var songitem = realm!!.createObject(Songdetails::class.java, nextID)
songitem.songname = thisTitle
songitem.songartist = thisArtist
songitem.songurl = thisurls
songitem.songimage = thisTitle
EventBus.getDefault().post("update")
}
})
} else {
realm = Realm.getDefaultInstance()
realm!!.executeTransaction(object : Realm.Transaction {
override fun execute(realm: Realm) {
// increment index
var num = realm.where(Songdetails::class.java).max("id")
var nextID: Int
if (num == null) {
nextID = 1
} else {
nextID = num.toInt() + 1
}
var songitem = realm!!.createObject(Songdetails::class.java, nextID)
songitem.songname = thisTitle
songitem.songartist = thisArtist
songitem.songurl = thisurls
songitem.songimage = "custom"
EventBus.getDefault().post("update")
}
})
}
}
} catch (ex: Exception) {
}
}
}
}