为什么我无法删除处理程序中运行的 EditText 上的文本?

问题描述 投票:0回答:1

这是我在

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中保留了上一次迭代时附加的文本(无法得到这个)。

java android asynchronous handler
1个回答
0
投票

您可以在 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);
}

我希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.