我有一個非常基本的問題。我正在按照建議的順序完成開發指南codelabs,但在“除錯簡介”第 6 節:“記錄正在運行的應用程式”中失敗了。我覺得這個解釋很混亂,因為對于初學者來說相當少。
如果某些事情沒有按預期作業,我很樂意洗掉并重新開始,但我還需要確保隨著我的進步,任何缺乏預期結果的情況都不是由于我的環境造成的。
在本課中,我們需要修改現有代碼以使用Log.d陳述句更新應用程式單個TextView ,以便我們在手機螢屏上看到ID Division_textview更新。
我嘗試了多種方法來添加最終宣告
findViewById<TextView>(R.id.division_textview).setText("${numerator / denominator}")
但不能將它添加到任何地方,以便在我的模擬器中更新值。我沒有收到任何錯誤,但由于本課沒有“解決方案代碼”,而且本課前面的圖片都使最終代碼的外觀變得相當模糊,有人可以幫我解決這個問題嗎?
我真的需要確保我的模擬器正常作業(沒有報告錯誤)并且缺少結果是我的代碼而不是我的設定。
這是有問題的課程(感謝您的提示!)
課
我的MainActivity.kt中的代碼進一步提供了以下有用的建議。請注意,我意識到這不是“最佳”代碼,此時我只是試圖按照說明進行操作。
package com.example.debugging
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.TextView
private const val TAG = "MainActivity"
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val helloTextView: TextView = findViewById(R.id.division_textview)
helloTextView.text = "Hello, debugging!"
logging()
division()
}
fun division() {
val numerator = 60
var denominator = 4
repeat(4) {
Thread.sleep(3)
findViewById<TextView>(R.id.division_textview).setText("${numerator / denominator}")
Log.v(TAG, "${numerator / denominator}")
denominator--
}
}
fun logging() {
Log.e(TAG, "ERROR: a serious error like an app crash")
Log.w(TAG, "WARN: warns about the potential for serious errors")
Log.i(TAG, "INFO: reporting technical information, such as an operation succeeding")
Log.d(TAG, "DEBUG: reporting technical information useful for debugging")
Log.v(TAG, "VERBOSE: more verbose than DEBUG logs")
}
}
uj5u.com熱心網友回復:
我認為這是一個非常草率且不正確的教程。(是的,即使它來自 Google。)如果您在主執行緒中休眠,則在整個repeat回圈完成之前您不會看到文本視圖內容更改,因此您只會看到最終值,之后denominator已經減為 0。此外,本教程聲稱您將看到它每三秒更改一次,即使帶有的代碼Thread.sleep(3)只會暫停 3毫秒。然后在他們的實際示例中,他們使用Thread.sleep(1)了 ,這與他們的說明相矛盾。
試試這個代碼:
// added to imports:
import androidx.lifecycle.lifecycleScope
import kotlinx.coroutines.*
// modified division function
fun division() = lifecycleScope.launch {
val numerator = 60
var denominator = 4
repeat(4) {
delay(3000)
findViewById<TextView>(R.id.division_textview).setText("${numerator / denominator}")
Log.v(TAG, "${numerator / denominator}")
denominator--
}
}
Using= lifecycleScope.launch {將你的函式變成一個協程,讓你使用delay()函式而不是Thread.sleep(),因此主執行緒有機會實際更新你的文本視圖,而不必等待整個repeat回圈完成。
這是不使用協程的另一種方法,但它并不那么漂亮:
fun division() = with(Handler(Looper.getMainLooper())) {
val numerator = 60
var denominator = 4
repeat(4) { i ->
postDelayed({
findViewById<TextView>(R.id.division_textview).setText("${numerator / denominator}")
Log.v(TAG, "${numerator / denominator}")
denominator--
}, i * 3000L)
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/446199.html
