java - 文本在 fragment 内更改后,Android 调用一次函数

标签 java android multithreading android-fragments android-asynctask

我试图在文本更改后的一段时间后调用一个函数。我设置了延迟,但由于某种原因我的函数被调用了两次。这是我的代码:

public class ExampleFragment extends Fragment {


private EditText mText;
private Handler mHandler;


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    mHandler = new Handler();

    View rootView = inflater.inflate(R.layout.fragment_start_process, container, false);     

    mText = (EditText) rootView.findViewById(R.id.editText1);

    mText.addTextChangedListener(new TextWatcher() {

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // TODO Auto-generated method stub

        }

        @Override
        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // TODO Auto-generated method stub

        }

        @Override
        public void afterTextChanged(final Editable s) {

            // HERE IS WHERE I WILL CALL MY FUNCTION (Prints show my issue)    

            System.out.println("TEXT CHANGE" + s);              

            final Runnable r = new Runnable() {

                @Override
                public void run() {
                    final Editable x = s;
                    System.out.println("DELAY TEXT " + xEditable);                      
                }
            };              
            mHandler.postDelayed(r, 1000);
        }
    });        

    return rootView;
}

我的 System.out.println 语句如下所示:

文字变化H

文本更改嗨

延迟文本嗨

延迟文本嗨

所以看起来当我将我的函数放入 runnable 时,它​​会运行两次。我只希望它运行一次(延迟文本应该只显示一次)。知道我做错了什么吗?我的整个目标是在文本更改后等待一段时间(以确保文本已完全上传),然后运行我的函数一次。我读过可以使用 AsyncTask,但我对此并不熟悉。任何帮助将不胜感激。

最佳答案

您的 Runnable 正在执行两次,因为在每个键入字符后都会调用 afterTextChanged()。

如果你想在用户开始输入 1 秒后执行一些代码,你可以向 runnable 添加一个标志,让它只运行一次。

 private boolean mFlag = true;


 @Override
 public void afterTextChanged(final Editable s) {

    // HERE IS WHERE I WILL CALL MY FUNCTION (Prints show my issue)    

    Log.w(TAG, "TEXT CHANGE " + s);

    final Runnable mRunnable = new Runnable() {
        @Override
        public void run(){
            final Editable x = s;
            Log.w(TAG, "DELAY TEXT " + x.toString());
        }
    }

    if(mFlag){
        mHandler.postDelayed(r, 1000);    
        mFlag = false;
    }

}

关于java - 文本在 fragment 内更改后,Android 调用一次函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24827812/

相关文章:

Java并发实践中的 "Listing 12.5. Producer-consumer test program for BoundedBuffer.",每线程校验和?

java - 在 TreeView 中实现 Java hashmap

java - 排序 12 个项目的最佳算法是什么

java - Jenkins 不显示 log4j 日志

java - Android apk可以加载本地库

c - 下面的代码有什么问题?预期 X 由线程 Func 1 修改,随后 X 由线程 Func 2 修改

java - 如何解决我的后台服务中的 "doing too much work on its main thread service"错误?

java - 如何让 float View 适合 TextView 数量可变的多行?

android - 在哪里/如何在 TabActivity 中实现 SQLiteDatabase 和 AsyncTask

android - 以编程方式接听 Whatsapp 视频通话