android之handler另起線程從網路下載常值內容時候提示progressBar—長條形的進度條動態顯示

來源:互聯網
上載者:User
package com.example.demodownload;import java.io.IOException;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.TextView;public class MainActivity extends Activity {private Button button;private TextView show;private String str;private ProgressDialog mypDialog;private int count = 50;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button = (Button) findViewById(R.id.button1);show = (TextView) findViewById(R.id.textView1);button.setOnClickListener(new OnClickListener() {public void onClick(View v) {DownLoadThread thread = new DownLoadThread();thread.start();}});mypDialog = new ProgressDialog(this);// 執行個體化// 設定進度條風格,風格為長形進度條,STYLE_SPINNER為圓的mypDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);mypDialog.setTitle("登陸");// 設定ProgressDialog 標題mypDialog.setMessage("正在驗證請稍後...");// 設定ProgressDialog 提示資訊mypDialog.setIndeterminate(false);// 設定ProgressDialogmypDialog.setCancelable(true);// 是否可以按退回按鍵取消mypDialog.setMax(100);// 設定最大值}Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:// 開始下載標誌mypDialog.show();// 讓ProgressDialog顯示break;case 3:// 更新進度條mypDialog.setProgress(count);break;case 2:// 結束下載標誌mypDialog.cancel();show.setText(str);break;}}};private class DownLoadThread extends Thread {@Overridepublic void run() {Message msg = new Message();msg.what = 1;// 開始下載標誌1handler.sendMessage(msg);HttpDownloader http = new HttpDownloader();str = http.download("http://m.weather.com.cn/data/101010100.html");// str =// http.download("http://211.143.108.6/wap/ResCatService?act=pic&s=h");msg = new Message();// 必須這樣寫,不然會報錯。因為msg.what = 2;handler.sendMessage(msg);}}public class HttpDownloader {// 根據URL下載檔案,前提是這個檔案當中的內容是文本,函數的傳回值就是文本當中的內容// 1.建立一個URL對象// 2.通過URL對象,建立一個HttpURLConnection對象// 3.得到InputStream// 4.從InputStream當中讀取資料private URL url;private char[] buf = new char[100];private InputStreamReader isr;public String download(String urlStr) {StringBuffer sb = new StringBuffer();try {url = new URL(urlStr);HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();// buffer = new BufferedReader(new InputStreamReader(// urlConn.getInputStream()));isr = new InputStreamReader(urlConn.getInputStream());int x = 0;while ((x = isr.read(buf)) != -1) {Log.i("msg", (count++) + "");Message msg = new Message();msg.what = 3;handler.sendMessage(msg);sb.append(new String(buf));}} catch (Exception e) {e.printStackTrace();} finally {try {if (isr != null) {isr.close();} else {return "error";}} catch (IOException e) {e.printStackTrace();}}return sb.toString();}}}

由於不知道所下載常值內容的長度,只能先這樣寫一個虛擬碼,上面的當然可以運行。

不過,對於真正的項目來說,應該也是不知道內容的大小的,大家可以看一下UC上的進度條,開始的時候是緩慢進入,到了一半的時候,基本上就進入頁面了。

所以不是真正的《根據將要下載內容的大小和已經下載內容的大小,改變progress進度》。不知道我說的是不是明白。

再說清楚一點:為了設定進度條的增加的動畫顯示,所以需要知道max值,需要動態更新progress的值。然而對於這個程式進度條的max值,這個值應該是設定為網頁內容的大小。然後每次下載一部分內容,然後發送一個訊息,根據訊息的內容改變progress,每次增加一點(在代碼裡面就是count++);(對於迴圈中每一次下載的內容,代碼裡面我設定的是100,個人建議1KB,不過由於這個頁面很小,1KB的話,進度條只會前進兩次,不太明顯,所以我設定的100)

對了,別忘了配置網路許可權呀。

讓我很奇怪的是manifest.xml檔案,下面是正確的寫法

[html]
view plaincopyprint?
  1. <uses-sdk android:minSdkVersion="8" />  
  2.   
  3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  4. <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  5. <uses-permission android:name="android.permission.INTERNET" />  

如果寫成下面這樣就會報錯,原因是下載的時候,buffer為空白,在網上找了半天不知道怎麼回事,有哪位知道是怎麼回事,可以留言。我這裡先謝謝了。

[html]
view plaincopyprint?
  1. <uses-sdk  
  2.       android:minSdkVersion="8"  
  3.       android:targetSdkVersion="15" />  
  4.   
  5.   <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
  6.   <uses-permission android:name="android.permission.READ_PHONE_STATE" />  
  7.   <uses-permission android:name="android.permission.INTERNET" /> 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.