我正在嘗試在 kotlin 中為 android 制作一個擦除應用程式。它只有一個按鈕可以完成所有程序。但是當用戶單擊按鈕時,螢屏凍結,我的 setText 或 setProgress 函式不起作用。我認為這是因為它認為它必須完成該程序并進行 UI 更改。如何在程序中間設定文本或設定進度?
我的代碼:
// findViewById
wipe_button = findViewById(R.id.wipe_button)
progress_bar = findViewById(R.id.progressBar)
main_textview = findViewById(R.id.main_textview)
// Getting available memory
freeMemory = getAvailableInternalMemorySizeInMB()
// progressBar Settings
progress_bar.max = 100
progress_bar.setProgress(0)
// OnClickListener
wipe_button.setOnClickListener {
checkPermissions()
if (isPermissionGranted) {
main_textview.setText("Started Wiping...")
progress_bar.setProgress(0)
fillStorage()
progress_bar.setProgress(10)
main_textview.setText("Created Filling Text. Copying...")
copyFiles()
progress_bar.setProgress(100)
main_textview.setText("Finished Deleting.")
Handler().postDelayed(Runnable {
main_textview.setText("Click The Button To Start Wiping")
progress_bar.setProgress(0)
}, 5000)
} else {
if (requestNumber >= 2) {
Toast.makeText(this, "Please Give Storage Permission To The App In Settings", Toast.LENGTH_SHORT).show()
} else {
requestPermissions()
}
}
}
和按鈕功能:
private fun fillStorage() {
val file = File(getExternalFilesDir(null), "fill-1.txt")
val fileWriter = FileWriter(file, true)
var fileSizeInMB = file.length() / 1048576
var fileSizeInKB = (file.length()).toInt() / 1024
while (fileSizeInMB < 4) {
fileWriter.append("00000000")
fileWriter.flush()
fileSizeInMB = (file.length() / 1048576)
fileSizeInKB = ((file.length().toInt()) / 1024)
when (fileSizeInKB) {
409 -> progress_bar.setProgress(1)
818 -> progress_bar.setProgress(2)
1227 -> progress_bar.setProgress(3)
1636 -> progress_bar.setProgress(4)
2045 -> progress_bar.setProgress(5)
2454 -> progress_bar.setProgress(6)
2863 -> progress_bar.setProgress(7)
3272 -> progress_bar.setProgress(8)
3681 -> progress_bar.setProgress(9)
4096 -> progress_bar.setProgress(10)
}
}
}
private fun copyFiles() {
val dir = File("/storage/emulated/0/Android/data/com.cemalmertozkan.wiped/files")
var dirSize = File(Environment.getExternalStorageDirectory().absolutePath).length() / 1048576
freeMemory = getAvailableInternalMemorySizeInMB()
var fillingSizeInMB = freeMemory - 100
val file = File(getExternalFilesDir(null), "fill-1.txt")
var onePercentProgressInMb = fillingSizeInMB / 80
var fileNumber = 1
while (freeMemory > 100) {
fileNumber = fileNumber 1
var fileNew = File(getExternalFilesDir(null), "fill-" fileNumber ".txt")
file.copyTo(fileNew, true)
freeMemory = getAvailableInternalMemorySizeInMB()
var completeNum : Int = (dirSize % onePercentProgressInMb).toInt()
var copiedFilesInGB = dirSize % 1024
main_textview.setText("Copied " copiedFilesInGB "GB Of Files.")
progress_bar.setProgress(completeNum 10)
}
progress_bar.setProgress(90)
main_textview.setText("Completed Copying. Deleting...")
dir.deleteRecursively()
}
uj5u.com熱心網友回復:
您需要在協程中運行fillStorage()andcopyFiles()函式,該協程將在非 UI 執行緒中運行這些任務,因此您的螢屏不會凍結。
請通過這個 - Android協程指南
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/411983.html
標籤:
