gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 12:06:24 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com