您的位置:首页 > 移动开发 > Android开发

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

2016-07-18 13:56 387 查看
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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息