先大概浏览一下我们获取网络图片的实际需求
当用户点击“获取图片”的时候就会进行一系列的操作,具体过程如下:
1.取得与服务器的连接
URL url=new URL(urlpath);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();//得到urlConnection对象
conn.setRequestMethod("GET");//声明请求方式
conn.setConnectTimeout(6*1000);//设置链接超时
2.得到数据
InputStream inputStream =conn.getInputStream();//得到服务端传回来的数据,相对客户为输入流
byte[] data=read(instream)
3.生成图片
File file=new File("car.jpg");
//FileOutputStream用于输出字节文件,例如图片
FileOutputStream fileOutputStream=new FileOutputStream(file);
4.关闭流
以上是介绍jase下图片的获取,下面给出在android环境下的实现
界面布局xml文件
<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"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取路径" />
<EditText
android:id="@+id/edit_path"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ems="10"
android:text="http://www.sinaimg.cn/qc/photo_auto/photo/23/29/32542329/32542329_950.jpg" >
</EditText>
<Button
android:id="@+id/btn_image"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="获取图片" />
<ImageView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/imageview"
/>
</LinearLayout>
MainActivity代码
package com.example.getdatainternet;
import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
private Button button;
private EditText editText;
private ImageView imageView;
private DownloadThread downthread;
NetTool netTool;
private static final String TAG="dataActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//netTool=new NetTool();
editText=(EditText) findViewById(R.id.edit_path);
imageView=(ImageView) findViewById(R.id.imageview);
downthread=new DownloadThread();
button=(Button) findViewById(R.id.btn_image);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
downthread.start();
}
});
}
class DownloadThread extends Thread{
@Override
public void run() {
String path=editText.getText().toString();
try {
byte[] data=NetTool.getImage(path);
Bitmap bm=BitmapFactory.decodeByteArray(data, 0, data.length);//使用数组的所有数据生成位图对象
imageView.setImageBitmap(bm);//show the image
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
网络数据获取工具代码
package com.example.getdatainternet;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.R.integer;
public class NetTool {
/**获取图片以字节数组存放数据,获取文本就要将字节转化为字符串
* */
public static byte[] getImage(String urlpath) throws Exception{
//首先我们要得到请求的路径,路径为我们想要的资源
//String urlpath="http://www.sinaimg.cn/qc/photo_auto/photo/23/29/32542329/32542329_950.jpg";
//建立URL类对象,抛异常
URL url=new URL(urlpath);
HttpURLConnection conn=(HttpURLConnection) url.openConnection();//得到urlConnection对象,基于http协议对象
// conn.connect();
conn.setRequestMethod("GET");//声明请求方式
conn.setConnectTimeout(6*1000);//设置链接超时
// conn.connect();
int x=conn.getResponseCode();
System.out.println(x);
if (conn.getResponseCode()==200) {//通过判断服务器返回的状态码来判断是否请求成功
InputStream inputStream =conn.getInputStream();//得到服务端传回来的数据,相对客户为输入流
return readInstream(inputStream);
}
return null;
}
//读取数据
public static byte[] readInstream(InputStream inputStream) throws Exception{
ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream();
byte[] buffer=new byte[1024];//声明缓冲区
int len;
while((len=inputStream.read(buffer))!=-1){//读取inputStream的数据存到buffer中,buffer实质是内存中的一部分
byteArrayOutputStream.write(buffer, 0, len);//把缓存区输出到字节数组
}
byteArrayOutputStream.close();
inputStream.close();
return byteArrayOutputStream.toByteArray();
}
}
这里值得强调一下的是,连接网络的实现一定要放在新的线程里实现,否则当程序运行到conn.getResponseCode()时就会崩溃,导致连接网络失败。