这是我在
Activity
(API 级别 30)中的代码:
EditText loggerText;
final Handler handlerLogger = new Handler(Looper.getMainLooper());
final int delayHandlerLogger = 200;
public void syncSongs() {
handlerLogger.removeCallbacksAndMessages(null);
loggerText.setText("");
loggerText.post(this::processLogger);
}
public void processLogger() {
handlerLogger.postDelayed(new Runnable() {
public void run() {
if (!isQueueEmpty()) {
String loggerLine = getQueueLastString;
String textCheck = loggerText.getText().toString();
loggerText.append(loggerLine + "\n");
}
handlerLogger.postDelayed(this, delayHandlerLogger);
}
}, delayHandlerLogger);
}
当我从
syncSongs()
方法调用 public boolean onOptionsItemSelected(@NonNull MenuItem item)
时(应该在发布之前用 setText("")
删除文本),第一次进入 if (!isQueueEmpty()) {
语句,textCheck
(即来自 loggerText
的文本,应该是空,因为 setText("")) 不是 ""。
为什么?我错过了什么吗?在这个异步进程中处理它有什么不正确的?
看起来
loggerText
在Runnable中是一个重复的对象,因为当我切换Activity并在Resume/onStart上检查它时,文本是空的,而在Runnable中保留了上一次迭代时附加的文本(无法得到这个)。
您可以在 Handler 中删除 EditText 中的文本。
loggerText.setText("")
就可以了。您可以通过将代码放入可运行文件中来测试它。
您的代码似乎运行良好。我已经通过使用 Log 检查
textCheck
对其进行了测试。
String textCheck = loggerText.getText().toString();
Log.d("TextCheckValue", textCheck);
我这边的 textCheck
返回一个空字符串。所以我真的不确定为什么你没有得到相同的结果。您是否可能尝试在处理程序之外获取 textCheck
值?如果是这样,请确保您将 textCheck
作为全局变量。通过在可运行程序中写入 String textCheck
,您将每 200 毫秒创建一个 NEW textCheck 对象,并且该 textCheck 对象的值会发生变化,因为 edittext 中的文本也会发生变化。如果您已经有了全局变量,请删除代码中的“String”部分:
textCheck = loggerText.getText().toString();
所以你的代码应该看起来像这样:
EditText loggerText;
final Handler handlerLogger = new Handler(Looper.getMainLooper());
final int delayHandlerLogger = 200;
//This is the textCheck object which you can access even outside the handler
String textCheck = "SomeText";
public void syncSongs() {
handlerLogger.removeCallbacksAndMessages(null);
// Set LoggerText to empty
loggerText.setText("");
// Run handler
loggerText.post(this::processLogger);
}
public void processLogger() {
handlerLogger.postDelayed(new Runnable() {
public void run() {
if (!isQueueEmpty()) {
String loggerLine = getQueueLastString;
// Let's store the text of loggerText on textCheck object
// The value of textCheck should be empty on the first run
textCheck = loggerText.getText().toString();
loggerText.append(loggerLine + "\n");
// On the second run, it should not return empty since there is
// a string on your EditText upon entering the second run
}
handlerLogger.postDelayed(this, delayHandlerLogger);
}
}, delayHandlerLogger);
}
我希望这有帮助。