java - 我有一个函数,在其中我正在使用匿名类运行一个线程,那么如何将值返回给该函数

标签 java android multithreading jsoup

下面的代码会更清楚地说明:

public static String TCMResponse(String params, final Context c) {
    final String url = "https://115.248.161.106/ois/API/android/" + params;
    new Thread(new Runnable() {
        @Override
        public void run() {
            String response="";

            try {
                Document doc = Jsoup.connect(url).validateTLSCertificates(false).timeout(6000).get();
                response = doc.text();

            }
            catch (IOException e) {
                Log.d("Err","External OIS not reachable!");
            }

            // I want to return 'response' here, for the TCMResponse()
        }
    }).start();
}

正如您从代码中看到的,有一个函数 TCMResponse() 接受我传递的 url 的参数,并且它执行网页抓取,我知道所有这些都可以使用 volley/JSONParser 轻松完成。但我只是在尝试如何使用网络抓取进行解析。

因此,在页面被抓取之后,我需要该函数来返回抓取页面的响应,

我已经将 Callable 与执行程序服务一起使用,但它再次卡住了线程.. 看看我做了什么:

public static String TCMResponse(String params, final Activity act) {

    StrictMode.ThreadPolicy policy = new
            StrictMode.ThreadPolicy.Builder()
            .permitAll().build();
    StrictMode.setThreadPolicy(policy);

    final String url = "https://115.248.161.106/ois/API/android/" + params;
    response="";

    class MyBgThread implements Callable<String>
    {
        @Override
        public String call() throws Exception {
            try{
                Document doc = Jsoup.connect(url).validateTLSCertificates(false).timeout(6000).get();
                return doc.text();
            }catch (Exception e)
            {
                Log.d("Exception",e.toString());
                Snackbar.with(act, null)
                        .type(Type.ERROR)
                        .message("Something got wrong!")
                        .duration(Duration.LONG)
                        .show();
                return "{'auth':'false'}";
            }
        }
    }

    Callable<String> worker = new MyBgThread();
    ExecutorService ex = Executors.newSingleThreadExecutor();
    Future<String> future = ex.submit(worker);
    try{
        response = future.get();
    }catch(Exception e)
    {
        Log.d("Thread Ex",e+"");
    }
    ex.shutdown();
    return response;
}

最佳答案

由于您调用Future::get(),主线程被阻塞.

来自文档:

Waits if necessary for the computation to complete, and then retrieves its result.

这意味着;如果任务Thread还没完,当前Thread将等待直到返回结果。

<小时/>

我可以在您的代码中看到另一个问题:您正在显示 Snackbar ,这是一个 UI 组件,位于 Thread 中那不是UI Thread .

由于您正在处理 Android ,我肯定会使用 AsyncTask ,执行 doInBackground() 中昂贵的调用,然后更新 onPostExecute() 中的 UI .

关于java - 我有一个函数,在其中我正在使用匿名类运行一个线程,那么如何将值返回给该函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46880927/

相关文章:

java - 我的 RecyclerView 项目添加代码时出现异常

Android PlaceFilter 与 Google Places API 的结合使用

android - android studio 中的 proguard-rules.txt 在哪里?

c++ - 我如何为以下代码进行进程同步?

java - SOAP 请求 : Illegal Protocol https for HTTP URLConnection Factory

java - Netbeans Java - 您的 sql 语法有错误

java - 从java访问oracle数据类型

java - org.apache.hadoop.io.compress.GzipCodec,此类中的GzipOutputStream未关闭,因此内存泄漏

python - 如何运行多线程Python脚本

c++ - 对 Boost 线程的 undefined reference