android学笔记 AsynTask异步向服务器Post图片

本文介绍如何在Android应用中利用AsynTask实现图片的异步上传功能,并详细讲解了HTTP POST请求的具体实现过程。

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

Android是不允许在子线程中进行UI操作的,但有些时候,我们必须在子线程里去执行一些耗时任务,然后根据任务的执行结果来更新相应的UI控件。对于这种情况,

Android提供了一套异步处理机制,这里我用了AsynTask向服务器Post图片。

首先定义了个向服务器Post图片的工具类

public class HttpHelper {

	public static String submitPostData(String url, byte[] PostData) {
		URL u = null;
		try {
			u = new URL(url);
			HttpURLConnection httpURLConnection = (HttpURLConnection) u
					.openConnection();
			httpURLConnection.setConnectTimeout(3000); // 设置连接超时时间
			httpURLConnection.setDoInput(true);// 打开输入流,以便从服务器获取数据
			httpURLConnection.setDoOutput(true);// 打开输出流,以便向服务器提交数据
			httpURLConnection.setRequestMethod("POST"); // 设置以Post方式提交数据
			httpURLConnection.setUseCaches(false);// 使用Post方式不能使用缓存
			// 设置请求体的类型是文本类型
			httpURLConnection.setRequestProperty("Content-Type",
					"application/x-www-form-urlencoded");
			// 设置请求体的长度
			httpURLConnection.setRequestProperty("Content-Length",
					String.valueOf(PostData.length));
			// 获得输出流,向服务器写入数据
			OutputStream outputStream = httpURLConnection.getOutputStream();
			outputStream.write(PostData);

			int response = httpURLConnection.getResponseCode(); // 获得服务器的响应码
			if (response == HttpURLConnection.HTTP_OK) {
				InputStream inptStream = httpURLConnection.getInputStream();
				return dealResponseResult(inptStream); // 处理服务器的响应结果
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		return "";
	}

	/*
	 * * Function : 处理服务器的响应结果(将输入流转化成字符串) 3 * Param : inputStream服务器的响应输入流 4
	 * * Author : Linyu
	 */
	public static String dealResponseResult(InputStream inputStream) {
		String resultData = null; // 存储处理结果
		ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
		byte[] data = new byte[1024];
		int len = 0;
		try {
			while ((len = inputStream.read(data)) != -1) {
				byteArrayOutputStream.write(data, 0, len);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
		resultData = new String(byteArrayOutputStream.toByteArray());
		return resultData;
	}
}


接着定义了一个类继承AsynTask

public class PhotoAsynTast extends AsyncTask<String, Integer, String> {

	private Context context;
	private byte[] photoByte;
	private ProgressBar progressBar;
	
	public PhotoAsynTast(Context ctx,byte[] photoByte,ProgressBar progressBar){
		this.context = ctx;
		this.photoByte = photoByte;
		this.progressBar = progressBar;
	}
	
	 //doInBackground方法内部执行后台任务,不可在此方法内修改UI  
	@Override
	protected String doInBackground(String... params) {
		
		String retult = HttpHelper.submitPostData(params[0], photoByte);
		
		return retult;
	}

	//onPostExecute方法用于在执行完后台任务后更新UI,显示结果  
	@Override
	protected void onPostExecute(String result) {
		
		Toast.makeText(context, result, Toast.LENGTH_LONG).show();
	}
	
	 //onProgressUpdate方法用于更新进度信息 
	@Override
	protected void onProgressUpdate(Integer... progresses) {
		
		progressBar.setProgress(progresses[0]);
	}
	
}
然后在主Activity中执行AsynTask方法

pa = new PhotoAsynTast(this, imageByte,progressBar);
pa.execute(HttpPath.DATA_URL);

这里还用到了将图片转化为二进制流的方法

 public byte[] Bitmap2Bytes(Bitmap bm) {
	      ByteArrayOutputStream baos = new ByteArrayOutputStream();
	      bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
	       return baos.toByteArray();
	 }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值