Java函数返回空字符串

时间:2016-03-12 18:08:40

标签: java android jsoup

我尝试使用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;
}

4 个答案:

答案 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();
}