diff --git a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt index a30358f6b..d31efc649 100644 --- a/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/BaseReadAloudService.kt @@ -8,8 +8,6 @@ import android.content.Intent import android.content.IntentFilter import android.graphics.BitmapFactory import android.media.AudioManager -import android.os.Handler -import android.os.Looper import android.support.v4.media.session.MediaSessionCompat import android.support.v4.media.session.PlaybackStateCompat import androidx.annotation.CallSuper @@ -48,7 +46,6 @@ abstract class BaseReadAloudService : BaseService(), } } - internal val handler = Handler(Looper.getMainLooper()) private lateinit var audioManager: AudioManager private var mFocusRequest: AudioFocusRequestCompat? = null private var broadcastReceiver: BroadcastReceiver? = null diff --git a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt index 0e75eb04e..18788fa4a 100644 --- a/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt +++ b/app/src/main/java/io/legado/app/service/HttpReadAloudService.kt @@ -10,8 +10,10 @@ import io.legado.app.model.ReadBook import io.legado.app.model.analyzeRule.AnalyzeUrl import io.legado.app.service.help.ReadAloud import io.legado.app.utils.* +import kotlinx.coroutines.delay import kotlinx.coroutines.ensureActive import kotlinx.coroutines.isActive +import kotlinx.coroutines.launch import java.io.File import java.io.FileDescriptor import java.io.FileInputStream @@ -238,7 +240,8 @@ class HttpReadAloudService : BaseReadAloudService(), if (what == -38 && extra == 0) { return true } - handler.postDelayed({ + launch { + delay(100) readAloudNumber += contentList[nowSpeak].length + 1 if (nowSpeak < contentList.lastIndex) { nowSpeak++ @@ -246,7 +249,7 @@ class HttpReadAloudService : BaseReadAloudService(), } else { nextChapter() } - }, 50) + } return true } diff --git a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt index 7025b6442..b57bc6987 100644 --- a/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt +++ b/app/src/main/java/io/legado/app/ui/book/read/ReadBookActivity.kt @@ -5,8 +5,6 @@ import android.app.Activity import android.content.Intent import android.content.res.Configuration import android.os.Bundle -import android.os.Handler -import android.os.Looper import android.view.* import android.view.ViewGroup.LayoutParams.WRAP_CONTENT import androidx.activity.result.contract.ActivityResultContracts @@ -53,7 +51,9 @@ import io.legado.app.ui.replace.edit.ReplaceEditActivity import io.legado.app.ui.widget.dialog.TextDialog import io.legado.app.utils.* import kotlinx.coroutines.Dispatchers.IO +import kotlinx.coroutines.Job import kotlinx.coroutines.delay +import kotlinx.coroutines.isActive import kotlinx.coroutines.launch class ReadBookActivity : ReadBookBaseActivity(), @@ -109,15 +109,9 @@ class ReadBookActivity : ReadBookBaseActivity(), override val isInitFinish: Boolean get() = viewModel.isInitFinish override val isScroll: Boolean get() = binding.readView.isScroll - private val mHandler = Handler(Looper.getMainLooper()) - private val keepScreenRunnable = Runnable { keepScreenOn(false) } - private val autoPageRunnable = Runnable { autoPagePlus() } - private val backupRunnable = Runnable { - if (!BuildConfig.DEBUG) { - ReadBook.uploadProgress() - Backup.autoBack(this) - } - } + private var keepScreenJon: Job? = null + private var autoPageJob: Job? = null + private var backupJob: Job? = null override var autoPageProgress = 0 override var isAutoPage = false private var screenTimeOut: Long = 0 @@ -169,7 +163,7 @@ class ReadBookActivity : ReadBookBaseActivity(), override fun onPause() { super.onPause() autoPageStop() - mHandler.removeCallbacks(backupRunnable) + backupJob?.cancel() ReadBook.saveRead() timeBatteryReceiver?.let { unregisterReceiver(it) @@ -629,7 +623,7 @@ class ReadBookActivity : ReadBookBaseActivity(), launch { autoPageProgress = 0 binding.readMenu.setSeekPage(ReadBook.durPageIndex()) - mHandler.postDelayed(backupRunnable, 600000) + startBackupJob() } } @@ -692,38 +686,42 @@ class ReadBookActivity : ReadBookBaseActivity(), override fun autoPageStop() { if (isAutoPage) { isAutoPage = false - mHandler.removeCallbacks(autoPageRunnable) + autoPageJob?.cancel() binding.readMenu.setAutoPage(false) upScreenTimeOut() } } private fun autoPagePlus() { - var delayMillis = ReadBookConfig.autoReadSpeed * 1000L / binding.readView.height - var scrollOffset = 1 - if (delayMillis < 20) { - var delayInt = delayMillis.toInt() - if (delayInt == 0) delayInt = 1 - scrollOffset = 20 / delayInt - delayMillis = 20 - } - mHandler.removeCallbacks(autoPageRunnable) - if (!menuLayoutIsVisible) { - if (binding.readView.isScroll) { - binding.readView.curPage.scroll(-scrollOffset) - } else { - autoPageProgress += scrollOffset - if (autoPageProgress >= binding.readView.height) { - autoPageProgress = 0 - if (!binding.readView.fillPage(PageDirection.NEXT)) { - autoPageStop() + autoPageJob?.cancel() + autoPageJob = launch { + while (isActive) { + var delayMillis = ReadBookConfig.autoReadSpeed * 1000L / binding.readView.height + var scrollOffset = 1 + if (delayMillis < 20) { + var delayInt = delayMillis.toInt() + if (delayInt == 0) delayInt = 1 + scrollOffset = 20 / delayInt + delayMillis = 20 + } + delay(delayMillis) + if (!menuLayoutIsVisible && isActive) { + if (binding.readView.isScroll) { + binding.readView.curPage.scroll(-scrollOffset) + } else { + autoPageProgress += scrollOffset + if (autoPageProgress >= binding.readView.height) { + autoPageProgress = 0 + if (!binding.readView.fillPage(PageDirection.NEXT)) { + autoPageStop() + } + } else { + binding.readView.invalidate() + } } - } else { - binding.readView.invalidate() } } } - mHandler.postDelayed(autoPageRunnable, delayMillis) } override fun openSourceEditActivity() { @@ -878,6 +876,13 @@ class ReadBookActivity : ReadBookBaseActivity(), } } + private fun startBackupJob() { + backupJob?.cancel() + backupJob = launch { + delay(120000) + } + } + override fun finish() { ReadBook.book?.let { if (!ReadBook.inBookshelf) { @@ -897,7 +902,6 @@ class ReadBookActivity : ReadBookBaseActivity(), override fun onDestroy() { super.onDestroy() - mHandler.removeCallbacks(keepScreenRunnable) textActionMenu.dismiss() binding.readView.onDestroy() ReadBook.msg = null @@ -975,17 +979,20 @@ class ReadBookActivity : ReadBookBaseActivity(), * 重置黑屏时间 */ override fun screenOffTimerStart() { - if (screenTimeOut < 0) { - keepScreenOn(true) - return - } - val t = screenTimeOut - sysScreenOffTime - if (t > 0) { - mHandler.removeCallbacks(keepScreenRunnable) - keepScreenOn(true) - mHandler.postDelayed(keepScreenRunnable, screenTimeOut) - } else { - keepScreenOn(false) + keepScreenJon?.cancel() + keepScreenJon = launch { + if (screenTimeOut < 0) { + keepScreenOn(true) + return@launch + } + val t = screenTimeOut - sysScreenOffTime + if (t > 0) { + keepScreenOn(true) + delay(screenTimeOut) + keepScreenOn(false) + } else { + keepScreenOn(false) + } } } } \ No newline at end of file