diff --git a/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerViewModel.kt b/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerViewModel.kt index 1250858cce..4f2f8416d1 100644 --- a/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/cloudarchive/CloudArchiveManagerViewModel.kt @@ -68,7 +68,7 @@ class CloudArchiveManagerViewModel( override fun provideDataSingle(page: Int): Single>? { return if (mType == MyArchiveFragment.Type.MY_DOWNLOAD_ARCHIVE) { Single.create { emitter -> - val downloadList = VArchiveHelper.vArchiveEntityListLiveData.value + val downloadList = VArchiveHelper.vArchiveDao.getAll() val archiveEntityList = arrayListOf() if (downloadList != null) { for (vArchiveEntity in downloadList) { diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt index 04046f7ad4..378c433d05 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeFragmentAdapter.kt @@ -101,10 +101,12 @@ class HomeFragmentAdapter( if (oldItem?.columnHead != null && newItem?.columnHead != null) { return oldItem.columnHead?.name == newItem.columnHead?.name + && oldItem.columnHead?.data?.firstOrNull() == newItem.columnHead?.data?.firstOrNull() } if (oldItem?.horizontalColumn != null && newItem?.horizontalColumn != null) { return oldItem.horizontalColumn?.id == newItem.horizontalColumn?.id + && oldItem.horizontalColumn?.data?.firstOrNull() == newItem.horizontalColumn?.data?.firstOrNull() } if (oldItem?.image != null && newItem?.image != null) { @@ -113,10 +115,12 @@ class HomeFragmentAdapter( if (oldItem?.verticalSlide != null && newItem?.verticalSlide != null) { return oldItem.verticalSlide?.id == newItem.verticalSlide?.id + && oldItem.verticalSlide?.data?.firstOrNull() == newItem.verticalSlide?.data?.firstOrNull() } if (oldItem?.horizontalSlide != null && newItem?.horizontalSlide != null) { return oldItem.horizontalSlide?.id == newItem.horizontalSlide?.id + && oldItem.horizontalSlide?.data?.firstOrNull() == newItem.horizontalSlide?.data?.firstOrNull() } if (oldItem?.gallery != null && newItem?.gallery != null) { diff --git a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt index b9ffca3ec0..8181974818 100644 --- a/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/home/HomeViewModel.kt @@ -606,7 +606,7 @@ class HomeViewModel(application: Application) : AndroidViewModel(application) { val gameEntity = sourceList[index] rawList.add(gameEntity) } - transformRawDataIntoItemDataWithThrottle(mHomeContents) + transformRawDataIntoItemData(mHomeContents) } /** diff --git a/app/src/main/java/com/gh/vspace/VArchiveHelper.kt b/app/src/main/java/com/gh/vspace/VArchiveHelper.kt index 926245ca51..4d6741b4f0 100644 --- a/app/src/main/java/com/gh/vspace/VArchiveHelper.kt +++ b/app/src/main/java/com/gh/vspace/VArchiveHelper.kt @@ -1,6 +1,7 @@ package com.gh.vspace import android.content.Context +import android.database.sqlite.SQLiteDiskIOException import androidx.annotation.WorkerThread import com.gh.download.simple.DownloadMessageHandler import com.gh.download.simple.SimpleDownloadManager @@ -9,6 +10,7 @@ import com.gh.gamecenter.core.AppExecutor import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.runOnUiThread import com.gh.gamecenter.core.utils.MD5Utils +import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.entity.ArchiveEntity import com.gh.vspace.db.VArchiveEntity import com.gh.vspace.db.VGameDatabase @@ -22,7 +24,7 @@ import java.io.File object VArchiveHelper { - private val mVArchiveDao by lazy { VGameDatabase.instance.vArchiveDao() } + val vArchiveDao by lazy { VGameDatabase.instance.vArchiveDao() } private var mLatestArchiveFile: File? = null // 最近一个用于保存的存档文件 private var mSaveArchiveListener: ((VArchiveEntity) -> Unit)? = null @@ -33,9 +35,6 @@ object VArchiveHelper { private var mLatestDownloadingArchiveEntity: ArchiveEntity? = null // 最近一个正在下载的存档实例 - // 本地存档列表的 LiveData - val vArchiveEntityListLiveData by lazy { mVArchiveDao.getAllLiveData() } - // 本地存档存放的位置 val archivePath by lazy { HaloApp.getInstance().filesDir.absolutePath + File.separator } @@ -59,7 +58,10 @@ object VArchiveHelper { ) Utils.log(VHelper.LOG_TAG, "新的存档 ${it.id} 保存至数据库中") - mVArchiveDao.insert(vArchiveEntity) + runOnIoThread { + vArchiveDao.insert(vArchiveEntity) + refreshArchiveSnapshot() + } } mLatestDownloadingArchiveEntity = null } @@ -70,17 +72,32 @@ object VArchiveHelper { } } - vArchiveEntityListLiveData.observeForever { - // 更新已拥有的存档数据 - val archiveMd5Set = hashSetOf() - mVArchiveEntityList = ArrayList(it) - for (vArchiveEntity in mVArchiveEntityList) { - archiveMd5Set.add(vArchiveEntity.md5) - } - mVArchiveMd5Set = archiveMd5Set + runOnIoThread { + refreshArchiveSnapshot() } } + /** + * 手动更新存档相关的内存快照 + */ + @WorkerThread + fun refreshArchiveSnapshot() { + try { + mVArchiveEntityList = ArrayList(vArchiveDao.getAll()) + } catch (e: SQLiteDiskIOException) { + ToastUtils.toast("磁盘出现异常,请稍后再试") + e.printStackTrace() + return + } + + // 更新已拥有的存档数据 + val archiveMd5Set = hashSetOf() + for (vArchiveEntity in mVArchiveEntityList) { + archiveMd5Set.add(vArchiveEntity.md5) + } + mVArchiveMd5Set = archiveMd5Set + } + /** * 下载新的存档 */ @@ -161,7 +178,8 @@ object VArchiveHelper { gameVersion = vGameEntity?.downloadEntity?.versionName ?: "", ) - mVArchiveDao.insert(vArchiveEntity) + vArchiveDao.insert(vArchiveEntity) + refreshArchiveSnapshot() runOnUiThread { mSaveArchiveListener?.invoke(vArchiveEntity) @@ -217,7 +235,8 @@ object VArchiveHelper { for (vArchiveEntity in mVArchiveEntityList) { if (md5 == vArchiveEntity.md5) { runOnIoThread { - mVArchiveDao.delete(vArchiveEntity) + vArchiveDao.delete(vArchiveEntity) + refreshArchiveSnapshot() tryWithDefaultCatch { File(vArchiveEntity.filePath).delete() } @@ -232,7 +251,7 @@ object VArchiveHelper { */ @WorkerThread fun clearAllArchives() { - mVArchiveDao.clearAllArchives() + vArchiveDao.clearAllArchives() } /** diff --git a/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt b/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt index 6d036a1c22..cc90ebbf4e 100644 --- a/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt +++ b/app/src/main/java/com/gh/vspace/VDownloadManagerFragment.kt @@ -94,7 +94,7 @@ class VDownloadManagerFragment : mListRv.addOnScrollListener(mExposureListener) } - VHelper.vGameLiveData.observe(viewLifecycleOwner) { + VHelper.vGameDao.getAllLiveData().observe(viewLifecycleOwner) { onLoadRefresh() } } diff --git a/app/src/main/java/com/gh/vspace/VHelper.kt b/app/src/main/java/com/gh/vspace/VHelper.kt index 8fb35ebe3e..54805e3643 100644 --- a/app/src/main/java/com/gh/vspace/VHelper.kt +++ b/app/src/main/java/com/gh/vspace/VHelper.kt @@ -5,6 +5,7 @@ import android.content.ContentValues import android.content.Context import android.content.Intent import android.content.pm.PackageManager +import android.database.sqlite.SQLiteDiskIOException import android.database.sqlite.SQLiteFullException import android.net.Uri import android.os.Build @@ -13,7 +14,6 @@ import android.view.View import androidx.annotation.WorkerThread import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.* -import androidx.lifecycle.Observer import com.gh.common.constant.Config import com.gh.common.exposure.ExposureUtils import com.gh.common.history.HistoryHelper @@ -87,7 +87,8 @@ object VHelper { private var mInstalledInfoList: ArrayList = arrayListOf() // 已安装的列表,由畅玩服务返回 private var mLastSuccessfullyLaunchedGame: Pair? = null - private val mVGameDao by lazy { VGameDatabase.instance.vGameDao() } + val vGameDao by lazy { VGameDatabase.instance.vGameDao() } + private var mVGameSnapshotList = arrayListOf() private var m64UpdateEntity: AppEntity? = null @@ -133,14 +134,6 @@ object VHelper { // 临时的用来临时匹配安装完成时包名对应的游戏 ID 的 Map private var mTempPackageNameAndGameIdMap = hashMapOf() - val vGameLiveData by lazy { mVGameDao.getAllLiveData() } - - private val mVGameObserver by lazy { - Observer> { - mVGameSnapshotList = ArrayList(it) - } - } - private val mPackageObserver by lazy { PackageObserver.PackageChangeListener { val vaConfig = Config.getVSettingEntity()?.va ?: return@PackageChangeListener @@ -253,7 +246,9 @@ object VHelper { getVSpaceUpdate(config.arch32, false) } - vGameLiveData.observeForever(mVGameObserver) + runOnIoThread { + refreshVGameSnapshot() + } } } @@ -262,7 +257,12 @@ object VHelper { */ @WorkerThread fun refreshVGameSnapshot() { - mVGameSnapshotList = ArrayList(mVGameDao.getAll()) + try { + mVGameSnapshotList = ArrayList(vGameDao.getAll()) + } catch (e: SQLiteDiskIOException) { + ToastUtils.toast("磁盘出现异常,请稍后再试") + e.printStackTrace() + } } /** @@ -410,7 +410,7 @@ object VHelper { * (查询数据库,请在工作线程调用) */ @WorkerThread - fun getAllVGame(): List = mVGameDao.getAll() + fun getAllVGame(): List = vGameDao.getAll() /** * 获取库里全部畅玩游戏列表的内存快照 @@ -827,7 +827,8 @@ object VHelper { mInstallingVaPathSet.remove(downloadEntity.path) try { - mVGameDao.insert(VGameEntity.from(downloadEntity)) + vGameDao.insert(VGameEntity.from(downloadEntity)) + refreshVGameSnapshot() } catch (e: SQLiteFullException) { ToastUtils.toast("存储空间不足,安装失败") return@runOnIoThread @@ -1109,7 +1110,8 @@ object VHelper { // 存在安装完成任务,但数据没有正常插入到畅玩数据库的情况(磁盘满了?),遇到这种情况,手动再插一遍 if (!isThisVGameExistInDatabase && downloadEntity != null) { - mVGameDao.insert(VGameEntity.from(downloadEntity)) + vGameDao.insert(VGameEntity.from(downloadEntity)) + refreshVGameSnapshot() } } } catch (e: Exception) { @@ -1176,9 +1178,10 @@ object VHelper { if (packageName.isNullOrBlank()) return - mVGameDao.delete(packageName) + vGameDao.delete(packageName) + refreshVGameSnapshot() - if (mVGameDao.getAll().isEmpty()) { + if (vGameDao.getAll().isEmpty()) { VBackupHelper.removeAllDatabase() } else { VBackupHelper.backupDBToExternalStorage(HaloApp.getInstance()) @@ -1287,7 +1290,8 @@ object VHelper { it.downloadEntity.addMetaExtra(KEY_LAST_PLAYED_TIME, lastPlayedTime.toString()) it.downloadEntity.addMetaExtra(KEY_TOTAL_PLAYED_TIME, totalPlayedTime.toString()) try { - mVGameDao.insert(it) + vGameDao.insert(it) + refreshVGameSnapshot() } catch (e: SQLiteFullException) { ToastUtils.toast("设备存储空间不足,请清理后重试") } diff --git a/app/src/main/java/com/gh/vspace/db/VArchiveDao.kt b/app/src/main/java/com/gh/vspace/db/VArchiveDao.kt index a62b5d2162..f45d3f60f1 100644 --- a/app/src/main/java/com/gh/vspace/db/VArchiveDao.kt +++ b/app/src/main/java/com/gh/vspace/db/VArchiveDao.kt @@ -9,9 +9,6 @@ interface VArchiveDao { @Insert(onConflict = OnConflictStrategy.REPLACE) fun insert(archive: VArchiveEntity) - @Update(onConflict = OnConflictStrategy.REPLACE) - fun update(archive: VArchiveEntity) - @Delete fun delete(archive: VArchiveEntity) @@ -19,6 +16,6 @@ interface VArchiveDao { fun clearAllArchives() @Query("SELECT * FROM VArchiveEntity ORDER BY time desc") - fun getAllLiveData(): LiveData> + fun getAll(): List } \ No newline at end of file diff --git a/app/src/main/java/com/gh/vspace/db/VGameDao.kt b/app/src/main/java/com/gh/vspace/db/VGameDao.kt index fb79e7cbbc..7e4586c940 100644 --- a/app/src/main/java/com/gh/vspace/db/VGameDao.kt +++ b/app/src/main/java/com/gh/vspace/db/VGameDao.kt @@ -15,12 +15,6 @@ interface VGameDao { @Query("SELECT * FROM v_game") fun getAllLiveData(): LiveData> - @Delete - fun delete(gameList: List) - - @Delete - fun delete(game: VGameEntity) - @Query("DELETE FROM v_game WHERE packageName = :packageName") fun delete(packageName: String) diff --git a/app/src/main/java/com/halo/assistant/HaloApp.java b/app/src/main/java/com/halo/assistant/HaloApp.java index be9f7ab509..e4f3647bf8 100644 --- a/app/src/main/java/com/halo/assistant/HaloApp.java +++ b/app/src/main/java/com/halo/assistant/HaloApp.java @@ -232,15 +232,16 @@ public class HaloApp extends MultiDexApplication { AppExecutor.getIoExecutor().execute(() -> { initDataHelper(); - ExtensionsKt.doOnMainProcessOnly(this, () -> Tracker.init(this)); + ExtensionsKt.doOnMainProcessOnly(this, () -> { + Tracker.init(this); + DownloadDbManager.init(this); + }); deviceRamSize = DeviceUtils.getTotalRamSizeOfDevice(this); mChannel = mFlavorProvider.getChannelStr(this); // 异步初始化 SP SPUtils.getString(""); - - DownloadDbManager.init(this); }); RxJavaPlugins.setIoSchedulerHandler(scheduler -> AppExecutor.INSTANCE.getCachedScheduler());