下面的代码会更清楚地说明:
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/