您的位置:首页 > 理论基础 > 计算机网络

android开发--获取网络图片,读取进度条

2012-11-08 16:12 549 查看

本章写一个程序用来读取网络图片的功能,实现一个功能读取到服务器上的一张图片,然后下载到本地的程序本程序使用多线程来读取网络图片,包括自动判断缓存文件,还有进度条。别的不多说,上内容,我把实现过程都当做注释写到程序里了,很完全。希望对初学的朋友有帮助!



1、读取进度条的效果





2、成功读取到图片的效果





1.首先是Activity

package cn.itcast.pic;

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

public class mainActivity extends Activity {
private TextView addressET;
private ImageView imageIV;
private Handler handler=new Handler(); //在主线程中创建handler
private ProgressDialog dialog;
private ImageService service;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//1、获取对话框的id
addressET = (TextView) this.findViewById(R.id.addressET);
imageIV = (ImageView) this.findViewById(R.id.imageIV);

service = new ImageService(this);

}

public void onClick(View v){
//把图片放在一个新的线程里面来读取.
new Thread(){//创建一个新的线程
public void run(){
try {
String address = addressET.getText().toString();

handler.post(new Runnable() {//此处用一个匿名内部类,runnable自动把消息发送给主线程创建处理的handler,主线程会自动更新。
public void run() {

dialog=new ProgressDialog(mainActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);//设置进度条样式
dialog.setMessage("请稍候...");
dialog.setCancelable(false);//判断是否取消进度条
dialog.show();
}
});

//由于网络操作比较耗时,所以在新线程中操作
final Bitmap image = service.getImage(address);
handler.post(new Runnable() {
public void run() {
dialog.dismiss();
imageIV.setImageBitmap(image);//新线程更新界面,需要使用handler
}
});
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(getApplicationContext(), "服务器忙,请稍后再试!", 0).show();
}
}
}.start();
}
}


2.然后是读取图片的service

package cn.itcast.pic;

import java.io.File;
import java.io.FileOutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import android.accounts.NetworkErrorException;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;

public class ImageService {

private Context context;

public ImageService(Context context) {
super();
this.context = context;
}

public Bitmap getImage(String address) throws Exception {
// 1.通过Url对象封装url对象
URL url = new URL(address);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(3000);

// 2.判断是否有缓存文件
File cacheFile = new File(context.getCacheDir(),
URLEncoder.encode(address));// 缓存文件
if (cacheFile.exists())// 判断是否有缓存
conn.setIfModifiedSince(cacheFile.lastModified());// 发送缓存文件的最后修改时间

// 3.获取状态码,根据状态吗来判断接下来的操作。读取文件?还是写缓存,写缓存的时候记着用多个线程
int code = conn.getResponseCode();
if (code == 200) {
byte[] data = Util.read(conn.getInputStream());
Bitmap bm = BitmapFactory.decodeByteArray(data, 0, data.length);// 转化为图片
weiteCache(cacheFile, bm);
return bm;
} else if(code==304){
return BitmapFactory.decodeFile(cacheFile.getAbsolutePath());//读取本地数据,并转为图片来显示
}

//        如果不成功,抛异常,给我们自己看的
throw new NetworkErrorException("访问服务器出错:"+code);

}

// 4. 写缓存文件
private void weiteCache(final File cacheFile, final Bitmap bm) {
// 使用一个新的线程来写,这样的好处就是在页面打开的时候不会因为写缓存而等待时间
new Thread() {
public void run() {
try {
FileOutputStream fos = new FileOutputStream(cacheFile);
bm.compress(CompressFormat.JPEG, 100, fos);//指定格式 存储到本地
fos.close();
} catch (Exception e) {
throw new RuntimeException(e);
}

}
}.start();

}

}


3.读取网络文件的一个工具类

package cn.itcast.pic;

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

public class Util {

public static byte[] read(InputStream in) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = in.read(buffer)) != -1)
baos.write(buffer, 0, len);
baos.close();
byte[] data = baos.toByteArray();
return data;
}

}


4.主界面XML

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content" >

<EditText
android:id="@+id/addressET"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="textEmailAddress" >

<requestFocus />
</EditText>

<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text=" GO " />
</LinearLayout>

<ImageView
android:id="@+id/imageIV"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: