android网络通信之获取网络图片

先大概浏览一下我们获取网络图片的实际需求

当用户点击“获取图片”的时候就会进行一系列的操作,具体过程如下:

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()时就会崩溃,导致连接网络失败。
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值