zoukankan      html  css  js  c++  java
  • Android之ProgressBar初步应用

    这里利用 ProgressBar 即时显示下载进度。

    途中碰到的问题:

    1、主线程中不能打开 URL,和只能在主线程中使用 Toast 等

    2、子线程不能修改 UI

    3、允许网络协议

    4、暂停下载和继续下载

      ........

    fragment_main 布局文件

     1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     tools:context="com.dragon.android.textbar.MainActivity$PlaceholderFragment" >
     6 
     7     <!-- prigressBar 进度条 -->
     8     <!-- progress 当前进度 -->
     9     <!-- indeterminate 不明确的   默认false -->
    10     <ProgressBar
    11         android:id="@+id/progressBar1"
    12         style="?android:attr/progressBarStyleHorizontal"
    13         android:layout_width="match_parent"
    14         android:layout_height="wrap_content"
    15         android:layout_centerInParent="true"
    16         android:max="100"
    17         android:progress="0"
    18         android:indeterminate="true"/>
    19 
    20     <Button
    21         android:id="@+id/button1"
    22         android:layout_width="wrap_content"
    23         android:layout_height="wrap_content"
    24         android:layout_alignParentTop="true"
    25         android:layout_centerHorizontal="true"
    26         android:onClick="startLoad"
    27         android:layout_marginTop="86dp"
    28         android:background="#009FEE"
    29         android:text="@string/start"
    30         android:textColor="#ffffff" />
    31 
    32     <TextView
    33         android:id="@+id/textView1"
    34         android:layout_width="wrap_content"
    35         android:layout_height="wrap_content"
    36         android:layout_above="@+id/progressBar1"
    37         android:background="@null"
    38         android:layout_alignParentLeft="true" />
    39     
    40 </RelativeLayout>
    fragment_main

    strings.xml

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <resources>
     3 
     4     <string name="app_name">hwdownload</string>
     5     <string name="hello_world">Hello world!</string>
     6     <string name="action_settings">Settings</string>
     7     <string name="start">开始</string>
     8     <string name="stop">暂停</string>
     9     <string name="contin">继续</string>
    10 
    11 </resources>
    strings

    (问题3)在 AndroidManifest 文件中配置

    1 <!-- 请求网络权限 -->
    2     <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资源.....***************

     

  • 相关阅读:
    7. Bagging & Random Forest
    VS 多工程代码编写
    C++(vs)多线程调试 (转)
    halcon发布
    windows 批处理文件调用exe
    Halcon编程-基于形状特征的模板匹配
    缺陷检测 深度学习
    PID控制
    去掉图片中的红色标记的方法?
    图像处理之图像拼接四
  • 原文地址:https://www.cnblogs.com/xmcx1995/p/5831774.html
Copyright © 2011-2022 走看看