我尝试使用jsoup从Java中解析服务器中的数据。我写了一个新函数,它应该以字符串格式返回数据,但它返回空字符串。这是我的代码:
public String doc;
public String pare(final String url){
Thread downloadThread = new Thread() {
public void run() {
try {
doc = Jsoup.connect(url).get().toString();
}
catch (IOException e) {
e.printStackTrace();
}
}
};
downloadThread.start();
return doc;
}
答案 0 :(得分:2)
在线程有机会向其添加任何数据之前,您将立即返回doc对象 ,因此毫不奇怪这会返回为空。您不能以这种方式返回线程信息,而是需要使用某种类型的回调机制,一种在线程完成时以及数据准备好被消耗时通知您的机制。
答案 1 :(得分:1)
在Android平台上,你不应该让Jsoup为你下载任何东西。在引擎盖下,Jsoup使用HttpUrlConnection
。这个课程非常慢,并且有一些已知的问题。
请使用更快的替代方法:Volley。
以下是利用Volley的帖子中的功能。在以下示例代码中,我使用CountDownLatch
等待数据。
private static RequestQueue myRequestQueue = null;
public String pare(final String url) throws Exception {
final String[] doc = new String[1];
final CountDownLatch cdl = new CountDownLatch(1);
StringRequest documentRequest = new StringRequest( //
Request.Method.GET, //
url, //
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
doc[0] = Jsoup.parse(response).html();
cdl.coutDown();
}
}, //
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e("MyActivity", "Error while fetching " + url, error);
}
} //
);
if (myRequestQueue == null) {
myRequestQueue = Volley.newRequestQueue(this);
}
// Add the request to the queue...
myRequestQueue.add(documentRequest);
// ... and wait for the document.
// NOTA: User experience can be a concern here. We shouldn't freeze the app...
cdl.await();
return doc[0];
}
答案 2 :(得分:0)
我完全同意上述答案。您可以按照以下任何教程从服务器
获取数据http://www.androidhive.info/2014/05/android-working-with-volley-library-1/
http://www.vogella.com/tutorials/Retrofit/article.html
这两个是android
中网络调用的最佳库答案 3 :(得分:0)
在return语句之前添加downloadThread.join()。这将等到线程完成并将响应放入doc。但是:这样做你将从异步执行中获得所有好处,它的行为与您编写代码的行为相同:
public String pare(final String url){
return Jsoup.connect(url).get().toString();
}