URL
URL类提供如下两个重要方法:
(1)URLConnection openConnection():返回一个URLConnection对象,他表示到URL所引用的远程对象的链接。
(2)Inputstream openStream():打开于此URL的连接,并返回一个用于读取该URL资源的InputStream。
图片的简单加载:
主布局文件:
<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="hk.wangdao.play.restest.MainActivity" >
<ListView android:id="@string/lv_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
listView的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView android:id="@string/tv_filename"
android:layout_width="fill_parent"
android:gravity="center_horizontal"
android:layout_height="wrap_content"
android:textSize="20sp"/>
<ImageView android:id="@string/iv_img"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"/>
</LinearLayout>
主要的java代码:
package hk.wangdao.play.restest;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import android.R.integer;
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.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputBinding;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
public class MainActivity extends Activity {
private Bitmap bitmap;
private int imgs[];
private ListView list;
private MyAdapter adapter;
private List<ListItem> data=new ArrayList<MainActivity.ListItem>();
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
if(msg.what==123){
ListItem item=new ListItem(bitmap, "呵呵");
data.add(item);
adapter.setData(data);
adapter.notifyDataSetChanged();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//这里填写图片下载的地址
downImage("http://113.251.221.137/photos/IMG_20150321_213906.jpg");
list=(ListView)findViewById(R.string.lv_list);
adapter=new MyAdapter();
adapter.setData(data);
list.setAdapter(adapter);
}
public void downImage(final String add){
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url=new URL(add);
//获取URL资源的inputstream
InputStream inputStream=url.openStream();
//从inputstream中解析出图片
bitmap=BitmapFactory.decodeStream(inputStream);
//通知ui组件显示图片
handler.sendEmptyMessage(123);
inputStream.close();
inputStream=url.openStream();
//打开文件输出流,把下载的图片写到a.jpg这个文件中
OutputStream os=openFileOutput("a.jpg", MODE_WORLD_READABLE);
byte[] buff=new byte[1024];
//读取的字节数
int hasRead=0;
if((hasRead=inputStream.read(buff))!=-1){
os.write(buff, 0, hasRead);
}
inputStream.close();
os.close();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
class MyAdapter extends BaseAdapter{
private List<ListItem> data;
public List<ListItem> getData() {
return data;
}
public void setData(List<ListItem> data) {
this.data = data;
}
@Override
public int getCount() {
return data.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
View item=convertView;
if(item==null)
{
item=inflater.inflate(R.layout.filelist, parent, false);
ViewHolder holder=new ViewHolder(item);
item.setTag(holder);
}
ViewHolder holder=(ViewHolder)item.getTag();
holder.img.setImageBitmap(data.get(position).bm);
holder.name.setText(data.get(position).name);
Log.i("cao",data.get(position).name);
return item;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}}
//这里用来保存view的实例化,findviewbyid方法
class ViewHolder{
public ImageView img;
public TextView name;
public ViewHolder(View item){
img=(ImageView) item.findViewById(R.string.iv_img);
name=(TextView) item.findViewById(R.string.tv_filename);
}
}
class ListItem{
private Bitmap bm;
private String name;
public ListItem(Bitmap bm,String name){
this.bm=bm;
this.name=name;
}
}
}
这个的URL得输入流Inputstream使用了两次,第一次是通过BitmapFactory的decodeStream(InputStream)方法来解析该输入流中的图片。第二次则是使用IO讲输入流中的图片下载到本地。
这里要注意的还有就是:listview的用法,adapter中的列表数据的更新,先加载空的listview,然后通过网络获取到的图片进行加载。ListItem这个类也是:定义了bitmap和String这两个数据。hander的使用。(不知道为什么我在模拟器上使用的时候就可以加载成功,在手机上显示不出来图片)
补:Map的遍历(entryset)
for (Entry<String, String> entry: map.entrySet()) {
key = entry.getKey();
value = entry.getValue();
}