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?
- <uses-sdk android:minSdkVersion="8" />
-
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.INTERNET" />
如果寫成下面這樣就會報錯,原因是下載的時候,buffer為空白,在網上找了半天不知道怎麼回事,有哪位知道是怎麼回事,可以留言。我這裡先謝謝了。
[html]
view plaincopyprint?
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="15" />
-
- <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
- <uses-permission android:name="android.permission.READ_PHONE_STATE" />
- <uses-permission android:name="android.permission.INTERNET" />