記錄Android學習過程中遇到的問題

來源:互聯網
上載者:User

標籤:

  Android編程中經常會使用到ArrayAdapter、SimpleAdapter、BaseAdapter。其中ArrayAdapter、SimpleAdapter較為簡單,定製效果少,而BaseAdapter使用的非常普遍。

 1 asyncHttpClient.get(Constants.HEALTHY_NEWS_LIST,new AsyncHttpResponseHandler() { 2             @Override 3             public void onSuccess(int i, Header[] headers, byte[] bytes) { 4                 try { 5                     String str = new String(bytes,"gb2312"); 6                     Document document = Jsoup.parse(str); 7                     Element body = document.body(); 8                     Elements tdWidth = body.select("td[width=500]"); 9                     Elements tdHeight = tdWidth.select("td[height=40]");10                     Elements links = tdHeight.select("a");11                     for (Element link : links){12                         String title = link.text();13                         String url = link.attr("href");14                         healthy = new Healthy();15                         healthy.setTitle(title);16                         healthy.setUrl(url);17                         healthyList.add(healthy);18                     }19                     HealthyAdapter healthyAdapter = new HealthyAdapter(HealthyActivity.this,healthyList);20                     pullToRefreshListView.setAdapter(healthyAdapter);21                     pullToRefreshListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {22                         @Override23                         public void onItemClick(AdapterView<?> parent, View view, int position, long id) {24                             String title = healthyList.get((int)id).getTitle();25                             String url = healthyList.get((int)id).getUrl();26                             Intent intent = new Intent(HealthyActivity.this,HealthyDetailActivity.class);27                             intent.putExtra("url",url);28                             startActivity(intent);29                         }30                     });31                     Elements link_more = body.select("a[href^=http://health.enorth.com.cn/system/more/]");32                    textView.setText(link_more.attr("href"));33                 }catch (IOException e){34                     Log.d("file read exception : ", e.getMessage());35                 }36 37             }38 39             @Override40             public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {41                 Toast.makeText(HealthyActivity.this, "請檢查網路連接", Toast.LENGTH_SHORT).show();42                 Log.d("asyncHttpClient fail : ",throwable.getMessage());43             }44         });

這段代碼使用了AsynHttpClient的get()方法去獲得一個頁面的位元組流。AsyncHttpClient是我之前置入其他開源項目jar包的時候無意中匯入android-async-http-x.x.x.jar的,根據它的一個命名我猜想它是用來多線程發起http請求,在網上閱讀了相關部落格之後,其實就是HttpClient和new Runnable的一個封裝,這樣使得它可以直接在主線程中進行,不過與AsyncTask相比,缺點就是無法控制網路連接過程中OnPreExecute()的一個處理。對於返回位元組流亂碼的問題,閱讀了網頁源碼之後發現它的編碼方式為gb2312,這是一種在大陸經常使用的漢字編碼,據說可以顯示98%左右的漢字。設定字元的編碼方式為:String str = new String(bytes,"gb2312")。網頁代碼為html語言(超文字標記語言 (HTML)),在我看來其實跟xml一樣是一種標記性語言,其中java 5之後提供了一個工具類htmlParse用來解析html文本,不過之後很少進行更新而且比較複雜所以使用的就很少了。Jsoup則是網上非常流行html解析架構,在網路爬蟲方面使用的非常多。大概的使用就是用各種tag去解析文本。底層應該是使用了編譯原理的狀態機器的一些知識,編譯原理我學習的不好,這裡也說不出什麼了。今天早上遇到了一個很大的問題就是往HealthyList中add(healthy),我使用了Log將解析出來的title和url列印出來,在加入之後也將healthy列印出來,在for迴圈結束之後,我手動將healthy依次Log列印出來,非常奇怪的是居然最後一次列印出來的全是相同的值,這讓我迷惑了很久。後來在同學的啟發之下,我發現每次迴圈都要new一個healthy對象既可以解決問題。之前我之所以不在迴圈中每次都new一個healthy對象是因為我覺得這樣會節省記憶體,結果反而招致這樣的問題,其實往深層次分析還是對JAVA中對象的值傳遞和引用(地址)傳遞不清晰所導致的。之後我閱讀了這篇部落格,關於這一點講的非常詳細。http://6924918.blog.51cto.com/6914918/1283761 其中可以總結為兩點,基本類型作為參數傳遞時,是傳遞值的拷貝,無論你怎麼改變這個拷貝,原值是不會發生變化的。Java中對象作為參數傳遞時,是把對象在記憶體中的地址拷貝了一份給參數。其中mldnjava視頻是有專門對這個的講解的,不過好像是我遺忘了。所以在我沒有在for迴圈中new一個對象的時候,他每次都將healthy對象的地址的拷貝存放在HealthyList中,每次迴圈列印出來的都是正確的內容,但是當執行到最後一次迴圈的時候,地址中存放的對象是最後一次的內容,而這個內容的地址被拷貝了n次,並且都存放在了HealthyList中,所以最後我進行手工列印的時候出現的都是最後一次加入的內容,而且在我列印HelathyList的時候,列印出來的地址都是相同的,但是當時我居然沒有想到這個問題,我當時想的居然是每次new一個新對象太占記憶體,看來JAVA的基礎真的很重要。

記錄Android學習過程中遇到的問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.