安卓:handler下载网络图片(附带有进度条和网络连接判断的APP)

本文介绍了一个简单的Android应用程序,用于通过Handler实现异步下载并显示图片的功能。应用包含两个部分:一是基本的图片下载示例,二是增加了网络状态检查及进度提示的高级示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点击下载按钮后的结果:


注意: 加网络权限


逻辑代码文件:

<span style="font-size:18px;">package com.example.day18_handlertest;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

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

public class MainActivity extends Activity {

    ImageView iv;
    //Button bt;
    Bitmap bm ;
    String path="http://www.guaiwei.com/uploads/allimg/150326/28-150326141503.png";
    Handler handler=new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            Bitmap x = (Bitmap) msg.obj;
            iv.setImageBitmap(bm);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv=(ImageView) findViewById(R.id.iv);
    }

    public void click(View v)
    {
        new Thread(){
            public void run() {
                //创建请求客户端
                HttpClient hclient=new DefaultHttpClient();
                //请求  
                HttpGet request=new HttpGet(path);
                //字节输出流存放要下载的文件
                ByteArrayOutputStream bo=new ByteArrayOutputStream();
                try
                {
                    //得到客户端执行请求的结果
                    HttpResponse response=hclient.execute(request);
                    //请求成功执行的操作
                    if(response.getStatusLine().getStatusCode()==200)
                    {
                        //得到请求的实体内容
                        InputStream in = response.getEntity().getContent();
                        byte b[]=new byte[1024];
                        int count=0;
                        while((count=in.read(b))!=-1)
                        {
                            bo.write(b,0,count);
                            bo.flush();
                        }
                    }
                    bm= BitmapFactory.decodeByteArray(bo.toByteArray(), 0, bo.toByteArray().length);
                    
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                }
                Message msg=handler.obtainMessage();
                msg.obj=bm;
                handler.sendMessage(msg);
            }
        }.start();
    }
    
}

</span>



布局文件:

<span style="font-size:18px;"><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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <Button 
        android:id="@+id/bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下载图片"
        android:layout_below="@+id/iv"
        android:gravity="center"
        android:onClick="click"/>

</RelativeLayout>
</span>



项目2:

带有进度条和网络连接状态判断的handler下载图片APP:


加权限:

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>


请求网络工具类:

<span style="font-size:18px;">package com.utils;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class HttpUtil {

	//判断是否有网络
	public static boolean isConn(Context context)
	{
		//得到网络的管理者
		ConnectivityManager manager=(ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
		NetworkInfo info=manager.getActiveNetworkInfo();
		if(info!=null)
		{
			return true;
		}
		else
		{
			return false;
		}
	}
	public static byte[] getData(String path)
	{
		//创建请求客户端
		HttpClient client=new DefaultHttpClient();
		//创建请求对象
		HttpGet hg=new HttpGet(path);
		ByteArrayOutputStream bo=new ByteArrayOutputStream();
		try 
		{
			//客户端执行请求
			HttpResponse hr=client.execute(hg);
			if(hr.getStatusLine().getStatusCode()==200)
			{
				 InputStream in = hr.getEntity().getContent();
				 byte b[]=new byte[1024];
				 int count=0;
				 while((count=in.read(b))!=-1)
				 {
					 bo.write(b, 0, count);
					 bo.flush();
				 }				 
			}
			return bo.toByteArray();
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
		return null;
	}
}
</span>

逻辑代码文件:

<span style="font-size:18px;">package com.example.day18_handleimg;

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

import com.utils.HttpUtil;

public class MainActivity extends Activity {

	ImageView iv;
	static final int ok=1;
	static final int error=ok+1;
	ProgressDialog pdialog;
	String path="http://www.guaiwei.com/uploads/allimg/150326/28-150326141503.png";
	Handler handler=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			switch(msg.what)
			{
			case ok:
				Bitmap c=(Bitmap) msg.obj;
				iv.setImageBitmap(c);
				break;
			case error:
				String str=(String) msg.obj;
				Toast.makeText(MainActivity.this, str, 0).show();
				break;
			}
			
			pdialog.dismiss();
		}		
	};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv=(ImageView) findViewById(R.id.iv);
        pdialog=new ProgressDialog(MainActivity.this);
        pdialog.setMessage("正在下载");
    }
    public void click(View v)
    {
    	pdialog.show();
    	new Thread(){
    		public void run() {
    			if(HttpUtil.isConn(MainActivity.this))
    	    	{//有网络
    	    		byte b[]=HttpUtil.getData(path);
    	    		Bitmap bm=BitmapFactory.decodeByteArray(b, 0, b.length);
    	    		Message msg=handler.obtainMessage();
    	    		msg.obj=bm;
    	    		msg.what=ok;
    	    		handler.sendMessage(msg);
    	    	}
    	    	else
    	    	{
    	    		//无网络
    	    		Message msg=handler.obtainMessage();
    	    		msg.obj="网络异常,请检查网络";
    	    		msg.what=error;
    	    		handler.sendMessage(msg);
    	    	}
    		};
    	}.start();
    }

    
}
</span>

布局文件:

<span style="font-size:18px;"><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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        />
    <Button 
        android:id="@+id/bt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="下载图片"
        android:onClick="click"
        android:layout_below="@+id/iv"/>

</RelativeLayout>
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值