From 395bfc744ed048cfa5dc5a673ebfb6fa30be6116 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=99=88=E5=90=9B=E9=99=B6?= Date: Tue, 20 Dec 2022 16:40:13 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8D=95=E5=A4=84=E7=90=86=E7=BA=BF?= =?UTF-8?q?=E7=A8=8B=E6=B1=A0=E4=B8=8D=E8=B6=B3=E4=BB=A5=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=9B=B4=E5=A4=9A=E4=BB=BB=E5=8A=A1=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20https://jira.shanqu.cc/browse/GHZS-801?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/common/util/DirectUtils.kt | 10 +++++----- .../com/gh/download/cache/ExoCacheManager.kt | 4 ++-- .../java/com/gh/gamecenter/MainActivity.java | 4 +--- .../com/gh/gamecenter/SplashScreenActivity.kt | 6 +++--- .../gamedetail/rating/RatingViewModel.kt | 3 ++- .../packagehelper/PackageRepository.kt | 12 ++++++++---- .../gamecenter/personal/HaloPersonalFragment.kt | 6 +++--- .../gamecenter/personal/HaloPersonalViewModel.kt | 16 +++++++++++++++- .../receiver/NetworkStateReceiver.java | 1 + .../video/poster/video/VideoPosterViewModel.kt | 6 ++---- .../java/com/gh/gamecenter/core/AppExecutor.kt | 13 ++++++++++++- 11 files changed, 54 insertions(+), 27 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/DirectUtils.kt b/app/src/main/java/com/gh/common/util/DirectUtils.kt index 984d815734..e32a3cc2e0 100644 --- a/app/src/main/java/com/gh/common/util/DirectUtils.kt +++ b/app/src/main/java/com/gh/common/util/DirectUtils.kt @@ -33,7 +33,7 @@ import com.gh.gamecenter.common.entity.Display import com.gh.gamecenter.common.entity.LinkEntity import com.gh.gamecenter.common.retrofit.Response import com.gh.gamecenter.common.utils.* -import com.gh.gamecenter.core.AppExecutor +import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.utils.ToastUtils import com.gh.gamecenter.discovery.DiscoveryActivity import com.gh.gamecenter.download.DownloadFragment.Companion.INDEX_UPDATE @@ -1521,7 +1521,7 @@ object DirectUtils { context.startActivity(intent) // 这里换个线程操作是为了做一点延时 - AppExecutor.ioExecutor.execute { + runOnIoThread { EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_HOME)) } } else { @@ -1542,7 +1542,7 @@ object DirectUtils { context.startActivity(intent) // 这里换个线程操作是为了做一点延时 - AppExecutor.ioExecutor.execute { + runOnIoThread { EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_BBS)) EventBus.getDefault().post(EBSkip(CommunityHomeFragment.EB_TAB, position)) } @@ -1565,7 +1565,7 @@ object DirectUtils { context.startActivity(intent) // 这里换个线程操作是为了做一点延时 - AppExecutor.ioExecutor.execute { + runOnIoThread { EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_VIDEO)) } } else { @@ -1584,7 +1584,7 @@ object DirectUtils { context.startActivity(intent) // 这里换个线程操作是为了做一点延时 - AppExecutor.ioExecutor.execute { + runOnIoThread { EventBus.getDefault().post(EBSkip(MainActivity.EB_SKIP_MAIN, MainWrapperFragment.INDEX_PERSONAL)) } } else { diff --git a/app/src/main/java/com/gh/download/cache/ExoCacheManager.kt b/app/src/main/java/com/gh/download/cache/ExoCacheManager.kt index 1e7d689d3e..8b7c7b03e4 100644 --- a/app/src/main/java/com/gh/download/cache/ExoCacheManager.kt +++ b/app/src/main/java/com/gh/download/cache/ExoCacheManager.kt @@ -48,7 +48,7 @@ object ExoCacheManager { fun preload(videoUri: String) { val preLength = getPreLength() if (preLength == 0L) return - runOnIoThread { + runOnIoThread(isHeavyWightTask = true) { val contentLength = getContentLength(videoUri) val cacheLength = if (contentLength >= preLength) preLength else contentLength val simpleCache = ExoSourceManager.getCacheSingleInstance(HaloApp.getInstance().application, null) @@ -63,7 +63,7 @@ object ExoCacheManager { specBuilder, true, null - ) { requestLength, bytesCached, newBytesCached -> + ) { _, _, _ -> // debugOnly { // Utils.log("$requestLength-$bytesCached-$newBytesCached") // } diff --git a/app/src/main/java/com/gh/gamecenter/MainActivity.java b/app/src/main/java/com/gh/gamecenter/MainActivity.java index bdbe59139a..bf29aea35e 100644 --- a/app/src/main/java/com/gh/gamecenter/MainActivity.java +++ b/app/src/main/java/com/gh/gamecenter/MainActivity.java @@ -326,10 +326,8 @@ public class MainActivity extends BaseActivity { // 初始化PlatformUtils PlatformUtils.getInstance(getApplicationContext()); HomePluggableHelper.activationFilterData(); - }); - //启动app删除视频缓存文件 - AppExecutor.getIoExecutor().execute(() -> { + // 启动app删除视频缓存文件 try { String dirPath = getCacheDir().getAbsolutePath() + File.separator + "exo"; FileUtils.deleteFolder(new File(dirPath)); diff --git a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt index 30514da2a5..2eff5928ef 100644 --- a/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt +++ b/app/src/main/java/com/gh/gamecenter/SplashScreenActivity.kt @@ -31,7 +31,7 @@ import com.gh.gamecenter.common.constant.Constants import com.gh.gamecenter.common.constant.RouteConsts import com.gh.gamecenter.common.tracker.TrackerLogger import com.gh.gamecenter.common.utils.* -import com.gh.gamecenter.core.AppExecutor +import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.core.utils.DisplayUtils import com.gh.gamecenter.core.utils.EmptyCallback import com.gh.gamecenter.core.utils.MD5Utils @@ -358,7 +358,7 @@ class SplashScreenActivity : BaseActivity() { } private fun prefetchData() { - AppExecutor.ioExecutor.execute { + runOnIoThread { Config.getGhzsSettings() mViewModel?.deviceDialogSetting() mViewModel?.filterDetailTags() @@ -390,7 +390,7 @@ class SplashScreenActivity : BaseActivity() { VHelper.recoverVDataIfPossible() // 检查是否有旧版本光环,有就删掉 - AppExecutor.ioExecutor.execute { deleteOutdatedUpdatePackage() } + runOnIoThread { deleteOutdatedUpdatePackage() } if (mStartMainActivityDirectly) { if (com.gh.gamecenter.common.BuildConfig.BUILD_TIME != 0L) { showGitLogDialogIfNeeded() diff --git a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingViewModel.kt b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingViewModel.kt index 4b100acf34..34b672123e 100644 --- a/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/gamedetail/rating/RatingViewModel.kt @@ -19,6 +19,7 @@ import com.gh.gamecenter.entity.GameEntity import com.gh.gamecenter.entity.Rating import com.gh.gamecenter.entity.RatingComment import com.gh.gamecenter.common.retrofit.Response +import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.energy.EnergyBridge import com.gh.gamecenter.retrofit.RetrofitManager import com.lightgame.utils.Utils @@ -78,7 +79,7 @@ class RatingViewModel(application: Application, val game: GameEntity, val type: } private fun initPackNameList() { - AppExecutor.ioExecutor.execute { + runOnIoThread { for (apk in game.getApk()) { val packageName = apk.packageName if (!TextUtils.isEmpty(packageName) diff --git a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt index 158691b071..37051177d6 100644 --- a/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt +++ b/app/src/main/java/com/gh/gamecenter/packagehelper/PackageRepository.kt @@ -20,8 +20,6 @@ import com.gh.gamecenter.core.utils.SPUtils import com.gh.gamecenter.entity.* import com.gh.gamecenter.manager.PackagesManager import com.gh.gamecenter.login.user.UserManager -import com.gh.gamecenter.packagehelper.PackageRepository.gameInstalled -import com.gh.gamecenter.packagehelper.PackageRepository.gameUpdate import com.gh.gamecenter.retrofit.RetrofitManager import com.halo.assistant.HaloApp import com.lightgame.utils.Utils @@ -53,9 +51,11 @@ object PackageRepository { private val mInstalledPkgList = Collections.synchronizedList(ArrayList()) + @Volatile + private var mIsInitialisingData = false + val gameUpdateLiveData = MutableLiveData>() val gameInstalledLiveData = MutableLiveData>() - val installedGameListLiveData = MutableLiveData>() // 已安装的游戏列表 (信息比 GameInstall 更全) private val mInstalledGameList = Collections.synchronizedList(ArrayList()) @@ -68,6 +68,9 @@ object PackageRepository { */ @JvmStatic fun initData() { + if (mIsInitialisingData) return + + mIsInitialisingData = true runOnIoThread { if (gameInstalled.isNotEmpty()) gameInstalled.clear() if (mInstalledGameList.isNotEmpty()) mInstalledGameList.clear() @@ -79,6 +82,8 @@ object PackageRepository { uploadAppList() initFilterPackage(list) { filteredList -> + mIsInitialisingData = false + mInstalledPkgList.addAll(filteredList) notifyInstallPkgData() @@ -452,7 +457,6 @@ object PackageRepository { private fun notifyGameInstallData() { PackagesManager.initGameInstall(ArrayList(gameInstalled)) gameInstalledLiveData.postValue(ArrayList(gameInstalled)) - installedGameListLiveData.postValue(ArrayList(mInstalledGameList)) } private fun notifyGameUpdateData() { diff --git a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFragment.kt b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFragment.kt index dfc150a45f..a3f9a7f2f6 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFragment.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalFragment.kt @@ -568,7 +568,7 @@ class HaloPersonalFragment : BaseLazyFragment() { DisplayUtils.dip2px(80F) + DisplayUtils.getStatusBarHeight(requireContext().resources) ) mStubBinding.listRefresh.setOnRefreshListener { - mHaloPersonalViewModel.getHaloAddons() + mHaloPersonalViewModel.getHaloAddons(true) if (CheckLoginUtils.isLogin()) { mUnreadViewModel.retry() MessageUnreadRepository.loadMessageUnreadTotal(false) @@ -791,7 +791,7 @@ class HaloPersonalFragment : BaseLazyFragment() { } private fun observeNoneUIRelatedChanges() { - mHaloPersonalViewModel.getHaloAddons() + mHaloPersonalViewModel.getHaloAddons(false) mUserViewModel.loginObsUserinfo.observe(this) { userInfoEntity: ApiResponse? -> val notifyUserInfo: UserInfoEntity? = userInfoEntity?.data if (notifyUserInfo != null && mUserInfoEntity == null) { // 单个用户,首次触发 @@ -831,7 +831,7 @@ class HaloPersonalFragment : BaseLazyFragment() { mUserViewModel.retryCheckLogin() } if (busNetworkState.isNetworkConnected) { - mHaloPersonalViewModel.getHaloAddons() + mHaloPersonalViewModel.getHaloAddons(false) } } diff --git a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalViewModel.kt b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalViewModel.kt index 8f5735df14..350beea3ef 100644 --- a/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/personal/HaloPersonalViewModel.kt @@ -37,6 +37,8 @@ import kotlin.collections.ArrayList class HaloPersonalViewModel(application: Application) : AndroidViewModel(application) { + private var mIsRequestingAddons = false + val appEntity = MutableLiveData() val haloAddData = MutableLiveData>() val recommendData = MutableLiveData>() @@ -44,13 +46,19 @@ class HaloPersonalViewModel(application: Application) : AndroidViewModel(applica val moreFeaturesData = MutableLiveData>() @SuppressLint("CheckResult") - fun getHaloAddons() { + fun getHaloAddons(forcedRefresh: Boolean) { + if (mIsRequestingAddons && !forcedRefresh) return + + mIsRequestingAddons = true + RetrofitManager.getInstance() .api.newHaloAddons .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : BiResponse>() { override fun onSuccess(data: ArrayList) { + mIsRequestingAddons = false + haloAddData.postValue(data) if (data.isNotEmpty()) { checkUpdate() @@ -67,6 +75,12 @@ class HaloPersonalViewModel(application: Application) : AndroidViewModel(applica } } } + + override fun onFailure(exception: Exception) { + super.onFailure(exception) + + mIsRequestingAddons = false + } }) } diff --git a/app/src/main/java/com/gh/gamecenter/receiver/NetworkStateReceiver.java b/app/src/main/java/com/gh/gamecenter/receiver/NetworkStateReceiver.java index 8630a99306..58b424cc30 100644 --- a/app/src/main/java/com/gh/gamecenter/receiver/NetworkStateReceiver.java +++ b/app/src/main/java/com/gh/gamecenter/receiver/NetworkStateReceiver.java @@ -20,6 +20,7 @@ public class NetworkStateReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 网络变更这里会被主进程和推送进程分别调用,这里只对主进程响应, + // 奇怪,初次注册监听就会有回调,会导致部分接口短时间内触发两次调用 ExtensionsKt.doOnMainProcessOnly(context, () -> { if (NetworkUtils.isNetworkConnected(context)) { RegionSettingHelper.getRegionSetting(); diff --git a/app/src/main/java/com/gh/gamecenter/video/poster/video/VideoPosterViewModel.kt b/app/src/main/java/com/gh/gamecenter/video/poster/video/VideoPosterViewModel.kt index 919ae09bd8..6924ed7034 100644 --- a/app/src/main/java/com/gh/gamecenter/video/poster/video/VideoPosterViewModel.kt +++ b/app/src/main/java/com/gh/gamecenter/video/poster/video/VideoPosterViewModel.kt @@ -4,10 +4,10 @@ import android.app.Application import android.graphics.Bitmap import android.media.MediaMetadataRetriever import androidx.lifecycle.* -import com.gh.gamecenter.core.AppExecutor import com.gh.gamecenter.common.utils.ImageUtils import com.gh.gamecenter.common.utils.throwExceptionInDebug import com.gh.gamecenter.common.utils.tryCatchInRelease +import com.gh.gamecenter.core.runOnIoThread import com.gh.gamecenter.entity.VideoEntity import java.io.File import kotlin.math.roundToLong @@ -25,9 +25,7 @@ class VideoPosterViewModel( init { if (videoPath != null) { - AppExecutor.ioExecutor.execute { - getImagesByVideo() - } + runOnIoThread { getImagesByVideo() } } else if (videoEntity != null) { val totalThumbsCount = 10 val startPosition = 0 diff --git a/module_core/src/main/java/com/gh/gamecenter/core/AppExecutor.kt b/module_core/src/main/java/com/gh/gamecenter/core/AppExecutor.kt index 90561bf735..1d86f85690 100644 --- a/module_core/src/main/java/com/gh/gamecenter/core/AppExecutor.kt +++ b/module_core/src/main/java/com/gh/gamecenter/core/AppExecutor.kt @@ -7,7 +7,10 @@ import com.gh.gamecenter.core.AppExecutor.ioExecutor import com.gh.gamecenter.core.AppExecutor.lightWeightIoExecutor import com.gh.gamecenter.core.AppExecutor.logExecutor import com.gh.gamecenter.core.AppExecutor.uiExecutor +import com.gh.gamecenter.core.utils.SentryHelper +import com.lightgame.utils.Utils import io.reactivex.schedulers.Schedulers +import java.util.* import java.util.concurrent.* /** @@ -35,7 +38,15 @@ object AppExecutor { } @JvmStatic - val heavyWeightIoExecutor: ExecutorService by lazy { Executors.newSingleThreadExecutor(GHThreadFactory("GH_HEAVY_WEIGHT_IO_THREAD")) } + val heavyWeightIoExecutor: ExecutorService by lazy { + ThreadPoolExecutor( + 0, + 3, + 20L, TimeUnit.SECONDS, + LinkedBlockingQueue(512), + GHThreadFactory("GH_HEAVY_WEIGHT_IO_THREAD") + ) + } @JvmStatic val logExecutor: ExecutorService by lazy { Executors.newSingleThreadExecutor(GHThreadFactory("GH_LOG_THREAD")) }