Android中实现下载URL地址的网络资源的实例分享

通过URL来获取网络资源并下载资源简单实例:

package com.android.xiong.urltest; 

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL; 

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.widget.ImageView; 

public class MainActivity extends Activity {
  ImageView show;
  Bitmap bitmap;
  Handler handler = new Handler() { 

    @Override
    public void handleMessage(Message msg) {
      if (msg.what == 0x123) {
        // 使用ImageView显示该图片
        show.setImageBitmap(bitmap); 

      }
    } 

  }; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    show = (ImageView) findViewById(R.id.show); 

    new Thread() { 

      @Override
      public void run() {
        // 定义一个URL对象
        URL url;
        try {
          url = new URL(
              "http://img1.gtimg.com/news/pics/hv1/37/195/1468/95506462.jpg");
          // 打开该URL的资源输入流
          InputStream is = url.openStream();
          // 从InputStream中解析出图片
          bitmap = BitmapFactory.decodeStream(is);
          // 发送消息
          handler.sendEmptyMessage(0x123);
          is.close();
          // 再次打开RL对应的资源输入流
          is = url.openStream();
          // 打开手机文件对应的输出流
          OutputStream os = openFileOutput("KEQIANG.JPG", MODE_APPEND);
          byte[] buff = new byte[1024];
          int hasRead = 0;
          // 将URL资源下载到本地
          while ((hasRead = is.read(buff)) > 0) {
            os.write(buff, 0, hasRead);
          }
          is.close();
          os.close();
        } catch (MalformedURLException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
        } 

      } 

    }.start();
  } 

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  } 

}
<LinearLayout 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"
  android:orientation="vertical"
  tools:context=".MainActivity" > 

  <ImageView
    android:id="@+id/show"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:contentDescription="@string/hello_world"/> 

</LinearLayout>

网络资源多线程下载:

package com.example.threaddown; 

import java.util.Timer;
import java.util.TimerTask; 

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar; 

public class MainActivity extends Activity { 

  EditText url;
  EditText target;
  Button downBn;
  ProgressBar bar;
  DownUtil downUtil;
  private int mDownStatus; 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 获取程序界面中的三个界面控制
    url = (EditText) findViewById(R.id.url);
    target = (EditText) findViewById(R.id.target);
    downBn = (Button) findViewById(R.id.downBn);
    bar = (ProgressBar) findViewById(R.id.br);
    // 创建一个Handler对象
    final Handler handler = new Handler() { 

      @Override
      public void handleMessage(Message msg) {
        if (msg.what == 0x123) {
          bar.setProgress(mDownStatus);
        }
      } 

    };
    downBn.setOnClickListener(new OnClickListener() { 

      @Override
      public void onClick(View v) {
        // 初始化DownUtil对象
        downUtil = new DownUtil(url.getText().toString(), target
            .getText().toString(), 6);
        new Thread() { 

          @Override
          public void run() {
            try {
              // 开始下载
              downUtil.download(); 

            } catch (Exception e) {
              e.printStackTrace();
            }
            // 定义每秒调度获取一次系统的完成进度
            final Timer timer = new Timer();
            timer.schedule(new TimerTask() { 

              @Override
              public void run() {
                // 获取下载任务的完成比例
                double completeRate = downUtil
                    .getCompleteRate();
                mDownStatus = (int) (completeRate * 1000);
                // 发送消息通知届满更新的进度条
                handler.sendEmptyMessage(0x123);
                // 下载完成之后取消任务进度
                if (mDownStatus >= 100) {
                  timer.cancel();
                }
              }
            }, 0, 1000);
          } 

        }.start();
      }
    });
  } 

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
  } 

}
package com.example.threaddown; 

import java.io.IOException;
import java.io.InputStream;
import java.io.RandomAccessFile;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL; 

public class DownUtil { 

  // 定义下载资源的路径
  private String path;
  // 指定所下载的文件的保存位置
  private String targetFile;
  // 定义需要使用多少线程下载资源
  private int threadNum;
  // 定义下载的线程对象
  private DownThread[] threads;
  // 定义下载的文件总大小
  private int fileSize; 

  public DownUtil(String path, String targetFile, int threadNum) {
    this.path = path;
    this.targetFile = targetFile;
    this.threadNum = threadNum;
  } 

  public void download() throws IOException {
    URL url = new URL(path);
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setConnectTimeout(5000);
    conn.setRequestMethod("GET");
    conn.setRequestProperty("Accept", "*/*");
    conn.setRequestProperty("Accept-Language", "zh-CN");
    conn.setRequestProperty("Charset", "UTF-8");
    conn.setRequestProperty("Connection", "Keep-Alive");
    // 得到文件的大小
    fileSize = conn.getContentLength();
    conn.disconnect();
    int currentPartsSize = fileSize / threadNum + 1;
    RandomAccessFile file = new RandomAccessFile(targetFile, "rw");
    // 设置本地文件的大小
    file.setLength(fileSize);
    file.close();
    for (int i = 0; i < threadNum; i++) {
      // 计算每条线程的下载位置
      int startPos = i * currentPartsSize;
      // 每个线程使用一个RandomAccessFile进行下载
      RandomAccessFile current = new RandomAccessFile(targetFile, "rw");
      // 定义该线程的下载位置
      current.seek(startPos);
      // 创建下载线程
      threads[i] = new DownThread(startPos, currentPartsSize, current);
      // 启动线程下载
      threads[i].start();
    } 

  } 

  // 获取下载的完成百分比
  public double getCompleteRate() {
    // 统计多条线程已经下载的总大小
    int sumSize = 0;
    for (int i = 0; i < threadNum; i++) {
      sumSize += threads[i].length;
    }
    return sumSize * 1.0 / fileSize;
  } 

  private class DownThread extends Thread {
    // 定义当前线程下载的位置
    private int startPos;
    // 定义当前线程下载文件的大小
    private int currentPartsSize;
    // 当前线程下载的文件块
    private RandomAccessFile currentPart;
    // 定义该线程已下载的字节数
    private int length; 

    public DownThread(int startPos, int currentPartsSize,
        RandomAccessFile currentPart) {
      this.startPos = startPos;
      this.currentPart = currentPart;
      this.currentPartsSize = currentPartsSize; 

    } 

    @Override
    public void run() {
      try {
        URL url = new URL(path);
        HttpURLConnection conn = (HttpURLConnection) url
            .openConnection();
        conn.setConnectTimeout(5000);
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Accept", "*/*");
        conn.setRequestProperty("Accept-Language", "zh-CN");
        conn.setRequestProperty("Charset", "UTF-8");
        conn.setRequestProperty("Connection", "Keep-Alive");
        InputStream in = conn.getInputStream();
        in.skip(startPos);
        int hasRead = 0;
        byte[] buffer = new byte[1024];
        // 读取网络数据,并写入本地文件
        while (length < currentPartsSize
            && (hasRead = in.read(buffer)) > 0) {
          currentPart.write(buffer, 0, hasRead);
          // 累计该线程下载的总大小
          length += hasRead;
        }
        currentPart.close();
        in.close(); 

      } catch (Exception e) {
        e.printStackTrace();
      } 

    } 

  } 

}
<LinearLayout 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"
  android:orientation="vertical"
  tools:context=".MainActivity" > 

  <EditText
    android:id="@+id/url"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="http://ksoap2-android.googlecode.com/svn/m2-repo/com/google/code/ksoap2-android/ksoap2-android-assembly/3.1.0/ksoap2-android-assembly-3.1.0-jar-with-dependencies.jar" /> 

  <EditText
    android:id="@+id/target"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="/mnt/sdcard/"/> 

  <Button
    android:id="@+id/downBn"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="down" /> 

  <ProgressBar
    android:id="@+id/br"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" /> 

</LinearLayout>
<!-- 在SD卡中创建与删除文件的权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 在SD开中写入数据的权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- 访问网路的权限 -->
<uses-permission android:name="android.permission.INTERNET" />
(0)

相关推荐

  • Android读取资源文件的方法

    Android读取资源文件的方法 1.放入到资源文件夹里面,也就是所创建android工程的res下面. 我们可以在里面建立文件夹,放置我们要读取的文件. 例如:res里面建立目录raw,将要读取的文件abc.bin放入到该文件夹下,此时通过 openRawResource()方法即可读取.代码为 InputStream is = getResources().openRawResource(R.raw.abc); 只要获取InputStream,一切就好办了! 注意:res下面的目录名字是有讲

  • android从资源文件中读取文件流并显示的方法

    本文实例讲述了android从资源文件中读取文件流并显示的方法.分享给大家供大家参考.具体如下: 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private void doRaw(){ InputStream is = this.getResources().openRawResource(R.raw.ziliao); try{ doRead(is); }catch(IOException e){ e.printStackTrace(

  • Android使用URL读取网络资源的方法

    URL(Uniform Resource Locator)是统一资源定位器,它是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它.就通常情况而言,URL可以由协议名.主机.端口和资源组成. URL类提供了多个构造器用于创建URL对象,一旦获得了URL对象之后,就可以调用如下常用方法来访问该URL对应的资源了. ->String getFile():获取此URL的资源名:

  • Android 读取资源文件实例详解

    Android 读取资源文件实例详解 本文主要介绍 Android 读取资源文件,直接从 assets 读取,从 Raw 文件中读取,InputStream 转 String. 以下为直接从assets读取: /** * 得到Assets里面相应的文件流 * * @param fileName * @return */ private InputStream getAssetsStream(String fileName) { InputStream is = null; try { is =

  • 解析Android资源文件及他们的读取方法详解

    Sam在Android开发中,有两种处理资源文件的方式.其一,是将所有资源文件以及JNI程序放置于一个单独的资源包.使用到他们时,使用文件方式读取.或者直接使用C++层代码读取. 其二,则是将资源文件加入到APK内部.使用各种不同的办法去得到其内容.方法一:适合于移植较大的C++程序时使用,因为C++代码数量众多,不太可能修改为JAVA代码.所以将其与资源文件以一定方式存放,并让他们自称体系是个好办法.但这造成软件的发布必须以APK+资源包的方式发布.方法二:则比较适合代码量不是非常大,且资源数

  • android读取Assets图片资源保存到SD卡实例

    复制代码 代码如下: public class ReadBitmap { public void readByte(Context c, String name, int indexInt) { byte[] b = null; int[] intArrat = c.getResources().getIntArray(indexInt); try { AssetManager am = null; am = c.getAssets(); InputStream is = am.open(nam

  • Android中实现下载URL地址的网络资源的实例分享

    通过URL来获取网络资源并下载资源简单实例: package com.android.xiong.urltest; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.MalformedURLException; import java.net.URL; import android.app.Activity; import android.gra

  • Android中实现下载和解压zip文件功能代码分享

    本文提供了2段Android代码,实现了从Android客户端下载ZIP文件并且实现ZIP文件的解压功能,非常实用,有需要的Android开发者可以尝试一下. 下载: DownLoaderTask.java 复制代码 代码如下: package com.johnny.testzipanddownload; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; im

  • Android中 TeaScreenPopupWindow多类型筛选弹框功能的实例代码

    Github地址 YangsBryant/TeaScreenPopupWindow (Github排版比较好,建议进入这里查看详情,如果觉得好,点个star吧!) 引入module allprojects { repositories { google() jcenter() maven { url 'https://www.jitpack.io' } } } implementation 'com.github.YangsBryant:TeaScreenPopupWindow:1.0.2' 主

  • C#自定义针对URL地址的处理类实例

    本文实例讲述了C#自定义针对URL地址的处理类.分享给大家供大家参考.具体分析如下: 这个C#类是专门针对URL网址处理的类,可以对URL地址进行Base64的加密和解密,可以通过函数的方式向URL添加参数,可以更新URL中已有参数的值,分析URL地址的域名.子域名,分析URL的所有参数和参数值,功能非常全面,还可以自己扩充,非常具有实用价值 using System; using System.Text.RegularExpressions; using System.Web; using S

  • Android中webview与JS交互、互调方法实例详解

    Android中webview与JS交互.互调方法实例详解 前言: 对于试水的功能,一般公司都会采用H5的方式来开发,可以用很少的资源与很短的项目工期来完成. 但许多情况下,H5页面会需要一些原生持有的一些如用户信息之类的数据,一些交互也需要调用原生的,如toast之类要保持同一个手机风格一致的交互行为.这个时候就需要能够让JS主动调用原生的方法来进行操作或者获取数据.或者是原生调用JS的方法在H5加载的时候传递一些参数. 对于原生调用JS的方法 我们需要实现一个WebViewClient,在这

  • Android中ListView下拉刷新的实现方法实例分析

    本文实例讲述了Android中ListView下拉刷新的实现方法.分享给大家供大家参考,具体如下: ListView中的下拉刷新是非常常见的,也是经常使用的,看到有很多同学想要,那我就整理一下,供大家参考.那我就不解释,直接上代码了. 这里需要自己重写一下ListView,重写代码如下: package net.loonggg.listview; import java.util.Date; import android.content.Context; import android.util.

  • Android中日期与时间设置控件用法实例

    本文实例讲述了Android中日期与时间设置控件用法.分享给大家供大家参考.具体如下: 1.日期设置控件:DatePickerDialog 2.时间设置控件:TimePickerDialog 实例代码: 页面添加两个Button,单击分别显示日期设置控件和时间设置控件,还是有TextView控件,用于显示设置后的系统时间 main.xml: <?xml version="1.0" encoding="utf-8"?> <LinearLayout x

  • Android 中自定义ContentProvider与ContentObserver的使用简单实例

    Android 中自定义ContentProvider与ContentObserver的使用简单实例 示例说明: 该示例中一共包含两个工程.其中一个工程完成了自定义ContentProvider,另外一个工程用于测试该自定义ContentProvider且在该工程中使用了ContentObserver监听自定义ContentProvider的数据变化 以下代码为工程TestContentProvider ContentProviderTest如下: package cn.testcontentp

  • Android中ViewFlipper的使用及设置动画效果实例详解

    本文实例讲述了Android中ViewFlipper的使用及设置动画效果.分享给大家供大家参考,具体如下: 说到左右滑动,其实实现左右滑动的方式很多,有ViewPaer,自定义实现Viewgroup,gallery等都可以达到这种效果.这里做下ViewFliper实现左右滑动的效果. 会用到以下的技术: 1.ViewFlipper 2.GestureDetector 3.Animation 主要是这三个类在起作用. ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容

  • Android中ActionBar和ToolBar添加返回箭头的实例代码

     1.ActionBar添加返回箭头 //onCreate方法中 ActionBar actionBar = this.getSupportActionBar(); actionBar.setTitle("搜索功能"); actionBar.setDisplayHomeAsUpEnabled(true); //activity类中的方法 @Override public boolean onOptionsItemSelected(MenuItem item) { if(item.get

随机推荐