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();
}
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();
}
相关文章推荐
- 小心服务器内存居高不下的元凶--WebAPI服务
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件