Android之ProgressBar即时显示下载进度详解
程序员文章站
2024-03-07 13:09:03
这里利用 progressbar 即时显示下载进度。
途中碰到的问题:
1、主线程中不能打开 url,和只能在主线程中使用 toast...
这里利用 progressbar 即时显示下载进度。
途中碰到的问题:
1、主线程中不能打开 url,和只能在主线程中使用 toast 等
2、子线程不能修改 ui
3、允许网络协议
4、暂停下载和继续下载
........
fragment_main 布局文件
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.dragon.android.textbar.mainactivity$placeholderfragment" > <!-- prigressbar 进度条 --> <!-- progress 当前进度 --> <!-- indeterminate 不明确的 默认false --> <progressbar android:id="@+id/progressbar1" style="?android:attr/progressbarstylehorizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerinparent="true" android:max="100" android:progress="0" android:indeterminate="true"/> <button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparenttop="true" android:layout_centerhorizontal="true" android:onclick="startload" android:layout_margintop="86dp" android:background="#009fee" android:text="@string/start" android:textcolor="#ffffff" /> <textview android:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/progressbar1" android:background="@null" android:layout_alignparentleft="true" /> </relativelayout>
strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">hwdownload</string> <string name="hello_world">hello world!</string> <string name="action_settings">settings</string> <string name="start">开始</string> <string name="stop">暂停</string> <string name="contin">继续</string> </resources>
(问题3)在 androidmanifest 文件中配置
<!-- 请求网络权限 -->
<uses-permission android:name="android.permission.internet"/>
mainactivity(问题1、2)
package com.dragon.android.textbar; import java.io.ioexception; import java.io.inputstream; import java.net.httpurlconnection; import java.net.url; import android.app.activity; import android.os.bundle; import android.view.view; import android.widget.button; import android.widget.progressbar; import android.widget.textview; import android.widget.toast; /** * 只有创建一个 view 的线程才可以改变这个 view 的ui!!! 主线程也叫 ui 线程 */ public class mainactivity extends activity { private progressbar progressbar1; private button button1; private textview textview1; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.fragment_main); progressbar1 = (progressbar) findviewbyid(r.id.progressbar1); button1 = (button) findviewbyid(r.id.button1); textview1 = (textview) findviewbyid(r.id.textview1); } public void startload(view view) { string text = (string) button1.gettext(); // 设置按钮内容 ----并没有用... button1.settext(text.equals(getresources().getstring(r.string.start)) ? r.string.stop : (text.equals(getresources().getstring(r.string.stop)) ? r.string.contin : r.string.stop)); progressbar1.setindeterminate(false); new thread(new runnable() { private int percent; @override public void run() { try { // 打开 url 必须在子线程 url url = new url( "http://b.zol-img.com.cn/sjbizhi/images/9/540x960/1472549276394.jpg"); httpurlconnection conn = (httpurlconnection) url.openconnection(); // conn.setrequestmethod("get"); // conn.setreadtimeout(5000); // conn.setconnecttimeout(5000); int contentlength = conn.getcontentlength(); if (conn.getresponsecode() == httpurlconnection.http_ok) { inputstream is = conn.getinputstream(); byte[] buffer = new byte[1024]; int len = -1; int sum = 0; while ((len = is.read(buffer)) != -1) { sum += len; // 注意强转方式,防止一直为0 percent = (int) (100.0 * sum / contentlength); // 在主线程上运行的子线程 runonuithread(new runnable() { @override public void run() { progressbar1.setprogress(percent); textview1.settext(percent + "%"); if (percent == progressbar1.getmax()) { toast.maketext(mainactivity.this, "下载完成!", toast.length_short) .show(); } } }); } is.close(); conn.disconnect(); } } catch (ioexception e) { e.printstacktrace(); } } }).start(); } }
**************然而并没有解决问题4,要用断点续传,但是还不会存放assets资源.....***************
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。