使用时,按钮只能点击两次

时间:2019-07-13 05:47:14

标签: android multithreading jsoup

我希望我的按钮在单击一次后能够工作。但是,仅当我单击两次时它才有效。

我认为此问题与Jsoup或Thread有关,因为当我删除Jsoup方法时,它可以正常工作。

当然,我已经添加了Jsoup库。

这是我的代码:

View.OnClickListener listener = new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            new Thread(){
                public void run(){
                    String word = editText.getText().toString();
                    try {
                        doc = Jsoup.connect("https://endic.naver.com/search.nhn?sLn=kr&searchOption=all&query="+word).get();
                    } catch (IOException e) {

                    }

                    Elements el = doc.getElementsByClass("fnt_e30");

                    if(el.size() == 0){
                        s="There is no result.";
                        return;
                    }
                    s="OK";
                }
            }.start();
            textView.setText(s);
        }
    };
    btn_search.setOnClickListener(listener);

2 个答案:

答案 0 :(得分:0)

我猜测通过“工作”,您的意思是说TextView的获取已设置为文本“ OK”。在这种情况下,您的代码可以正常运行,而s="OK";在单独的线程上运行。只有设置了该值后,textView.setText(s);才会按照您的期望运行。您可能需要按照以下几行做一些事情。

    View.OnClickListener listener = new View.OnClickListener(){
        @Override
        public void onClick(View v) {
            new Thread(){
                public void run(){
                    String word = editText.getText().toString();
                    try {
                        doc = Jsoup.connect("https://endic.naver.com/search.nhn?sLn=kr&searchOption=all&query="+word).get();
                    } catch (IOException e) {

                    }

                    Elements el = doc.getElementsByClass("fnt_e30");

                    if(el.size() == 0){
                        s="There is no result.";
                        return;
                    }
                    s="OK";
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            textView.setText(s);
                        }
                    });
                }
            }.start();
        }
    };
    btn_search.setOnClickListener(listener);

P.S-正如ADM在评论中所提到的,这是一个异步调用(因为它是在线程上完成的),Jsoup.connect将花费一些时间来连接并获取文档。您最好在单击一次按钮后将其停用(基本上向用户表明请求正在处理中,并请他们等待结果)。

答案 1 :(得分:0)

您正在以错误的方式进行操作。您正在侦听响应,并且也将其设置为变量,但未设置为textview。

为什么第二次发生?当您第一次单击setText时,将执行该代码,但没有任何值。

正确的方法。在 s 变量中设置值后,添加此代码。

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        textView.setText(s);
    }
});