如何使用Jsoup与Volley?

时间:2016-02-27 19:42:59

标签: android jsoup android-volley

我有一个使用Jsoup和AsyncTask的工作示例,并且工作正常。我对表现不满意。加载带有文本和图像的简单列表页面需要3-6秒。

我想以某种方式提升表现......所以我偶然发现了凌空抽射。

任何人都可以用jsoup来解释使用排球吗?

我用它来获取包含特定URL的doc对象:

 public Document GetDocument(String site) {      
        Document doc = Jsoup.connect(site).timeout(600000)
        .data("query", "Java")
        .userAgent("Mozilla")
        .get();

        return doc;
 }

我想我只会用jsoup和连接/下载与凌空分析数据?我使用Jsoup.connect(网站).timeout(600000)我应该用排球吗?

任何人都可以使用volley和jsoup编写/链接一个简单的例子吗?

2 个答案:

答案 0 :(得分:5)

  

任何人都可以使用volley和jsoup编写/链接一个简单的例子吗?

在幕后,Jsoup使用HttpUrlConnection。此类已知Android平台上尚未解决的问题,错误和性能问题。

相反,首先使用Volley加载数据,然后使用Jsoup解析它。

示例代码:

private static RequestQueue myRequestQueue = null;

public Document GetDocument(String site) throws Exception {   
   final Document[] doc = new Document[1];
   final CountDownLatch cdl = new CountDownLatch(1);

   StringRequest documentRequest = new StringRequest( //
        Request.Method.GET, //
        site, //
        new Response.Listener<String>() {
           @Override
           public void onResponse(String response) {
               doc[0] = Jsoup.parse(response);
               cdl.countDown();
           }
        }, //
        new Response.ErrorListener() {
           @Override
           public void onErrorResponse(VolleyError error) {
               // Error handling
               System.out.println("Houston we have a problem ... !");
               error.printStackTrace();
           }
        } //
   );

   if (myRequestQueue == null) {
       myRequestQueue = Volley.newRequestQueue(this);
   }

   // Add the request to the queue...
   myRequestQueue.add(documentRequest);

   // ... and wait for the document.
   // NOTE: Be aware of user experience here. We don't want to freeze the app...
   cdl.await();

   return doc[0];
}

参考

答案 1 :(得分:1)

根据Stephan的回答,我对这段代码做了一些修改,看起来像这样。我添加了UTF 8支持,因此它可以读取其他语言并指定重试策略。

private static RequestQueue myRequestQueue = null;

public Document GetDocument(String site) {
    final Document[] doc = new Document[1];
    final CountDownLatch cdl = new CountDownLatch(1);
    try {

        StringRequest documentRequest = new StringRequest( //
                Request.Method.GET, //
                site, //
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        String newStr = null;
                        try {
                            newStr = URLDecoder.decode(URLEncoder.encode(response, "iso8859-1"), "UTF-8");
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                        doc[0] = Jsoup.parse(newStr);
                        cdl.countDown();
                    }
                }, //
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        // Error handling
                        System.out.println("Houston we have a problem ... !");
                        error.printStackTrace();
                    }
                } //
        );

        if (myRequestQueue == null) {
            myRequestQueue = Volley.newRequestQueue(MainActivity._Instance);

            documentRequest.setRetryPolicy(new DefaultRetryPolicy(5000,
                    DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
                    DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
        }

        // Add the request to the queue...
        myRequestQueue.add(documentRequest);

        // ... and wait for the document.
        // NOTA: Be aware of user experience here. We don't want to freeze the app...
        cdl.await();
    }
    catch (Exception e) {
        Log.d("TMS", "Error parsing page " + site);
        e.printStackTrace();
        return null;
    }
    return doc[0];
}