編輯:關於Android編程
Document doc = Jsoup.connect(url).get();
二、Session保持
在項目中,通過浏覽器訪問網址點擊“下一頁”能正常翻頁,而Android客戶端每次GET的“下一頁”地址都是第一頁。原來是因為android客戶端向網站發送HTTP請求時,沒有在請求頭部設置JSESSIONID,而使用浏覽器訪問服務器時,在客戶端每次發起請求的時候,都會將JSESSIONID設置在Cookie頭中攜帶過去。因此可以在第一次數據請求時就獲取sessionid的值並保存在一個靜態變量中,然後將其打包在後續HTTP請求的Cookie中發給服務器,服務器根據這個JSESSIONID獲取對應的Session,而不是重新創建一個新Session。當然,也可以直接將第一次數據請求時獲取的cookies整個打包回去:
Connection.Response res= Jsoup.connect(url) .method(Method.GET) .execute();Document doc= Jsoup.connect(url) .cookies(res.cookies()) .timeout(10000) .get();
三、標簽解析
由於項目網站所需要解析的圖片標簽特有width=100%這種屬性,因此可通過以下方式解析出圖片地址並加載圖片:
Elements element = doc.select("img").select("[width=100%]"); // 具有 href 屬性的鏈接 Log.d("element", element.toString()); for(Element links : element) { String link = links.attr("src"); try { myFileUrl = new URL(link); } catch (MalformedURLException e) { Log.i("msg", "沒有數據"); } try { HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); conn.setConnectTimeout(0); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { Log.i("msg", "沒有數據"); } PicListInfo pi = new PicListInfo(); pi.setPicUrl(bitmap); newpiclistinfo.add(0,pi); }
四、listview+adapter顯示圖片
if(newpiclistinfo.size() > 0){ Collections.reverse(newpiclistinfo); piclistinfo.addAll(newpiclistinfo); sla.notifyDataSetChanged(); piclist.setDividerHeight(0); if(dlg_loading.isShowing()){ dlg_loading.cancel(); } }else { Log.i("msg", "沒有數據"); }由於網站每頁只顯示4張圖片,一共有8頁,因此在加載完前四張後需要保持session並模擬浏覽器的“翻頁”:if(count<8){ Element next=doc.getElementById("toNext"); String next_url=next.attr("href");//“下一頁”的url getpic(next_url);//調用圖片加載的異步線程 } else{ Log.i("msg", "加載完畢"); Toast.makeText(getApplicationContext(), "已全部加載", Toast.LENGTH_SHORT).show(); }附圖片加載的完整線程:public void getpic(String url){ new HTMLAsyncTask().execute(url); } private class HTMLAsyncTask extends AsyncTask> { Document doc = null; protected ArrayList doInBackground(String... Urls) { URL myFileUrl = null; Bitmap bitmap = null; ArrayList newpiclistinfo = new ArrayList (); try { String test=res.cookies().toString(); doc= Jsoup.connect(Urls[0]) .cookies(res.cookies()) .timeout(10000) .get(); Elements element = doc.select("img").select("[width=100%]"); // 具有 href 屬性的鏈接 Log.d("element", element.toString()); for(Element links : element) { String link = links.attr("src"); try { myFileUrl = new URL(link); } catch (MalformedURLException e) { Log.i("msg", "沒有數據"); } try { HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection(); conn.setConnectTimeout(0); conn.setDoInput(true); conn.connect(); InputStream is = conn.getInputStream(); bitmap = BitmapFactory.decodeStream(is); is.close(); } catch (IOException e) { Log.i("msg", "沒有數據"); } PicListInfo pi = new PicListInfo(); pi.setPicUrl(bitmap); newpiclistinfo.add(0,pi); } }catch (IOException e) { // TODO Auto-generated catch block Log.i("msg", "沒有數據"); } return newpiclistinfo; } // 異步方法調用對返回的字符串進行處理 protected void onPostExecute(ArrayList newpiclistinfo) { try { count++; if(newpiclistinfo.size() > 0){ Collections.reverse(newpiclistinfo); piclistinfo.addAll(newpiclistinfo); sla.notifyDataSetChanged(); piclist.setDividerHeight(0); if(dlg_loading.isShowing()){ dlg_loading.cancel(); } }else { Log.i("msg", "沒有數據"); } if(count<8){ Element next=doc.getElementById("toNext"); String next_url=next.attr("href"); getpic(next_url); } else{ Log.i("msg", "加載完畢"); Toast.makeText(getApplicationContext(), "已全部加載", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { Toast.makeText(getApplicationContext(), "網絡連接出錯啦", Toast.LENGTH_SHORT).show(); } } }
自從開始負責公共控件模塊開始,我一直都想好好分析一下Android事件傳遞流程,相信網上有一大堆相關文章,但是我個人覺得作為一個專業的控件開發人員,如果只是知道一下大概,
概述認識MVP模式MVP 模式實際上指的是 Model-View-Presenter 主要的目的是為了劃分各個模塊的負責區域,分工明確,使代碼清晰了很多。也是為了減少 A
WebView中存在著兩種緩存:網頁數據緩存(存儲打開過的頁面及資源)、H5緩存(即appcache)。一、網頁緩存1、緩存構成/data/data/package_na
上一篇講了activity的創建和啟動,這一篇,我們來講講activity的數據傳遞 activity之間的數據傳遞,這裡主要介紹的是activity之間簡單數據的傳遞,