Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android:漫畫APP開發筆記之從WAP網站解析圖片地址並加載圖片

Android:漫畫APP開發筆記之從WAP網站解析圖片地址並加載圖片

編輯:關於Android編程

一、使用Jsoup解析網頁

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



  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved