Android 上载多个图像时发生OutOfMemoryError
我正在将多个图像逐个上传到服务器。我在Android 上载多个图像时发生OutOfMemoryError,android,out-of-memory,Android,Out Of Memory,我正在将多个图像逐个上传到服务器。我在bm=BitmapFactory.decodeFile(imagepath)行中得到OOM错误。上传每个图像文件后,我重新使用了位图,但仍然显示错误。我的代码有问题吗?还有,有没有更好的方法从ArrayList一个接一个地上传多个图像 private void loadNext() { System.out.println("sammy_reached_loadNext"); if(finalImages.size()>
bm=BitmapFactory.decodeFile(imagepath)行中得到OOM错误代码>。上传每个图像文件后,我重新使用了位图,但仍然显示错误。我的代码有问题吗?还有,有没有更好的方法从ArrayList一个接一个地上传多个图像
private void loadNext() {
System.out.println("sammy_reached_loadNext");
if(finalImages.size()>0){
System.out.println("sammys_imagelist_after: "+finalImages.size());
String path = finalImages.get(0);
System.out.println("sammys_current_pic_path "+path);
new UploadSingleImage(path).execute();
}else{
File dir = new File(file_path);
if (dir.isDirectory()){
String[] children = dir.list();
if(children!=null){
for (int i = 0; i < children.length; i++){
new File(dir, children[i]).delete();
}
}
}
pd.dismiss();
Toast.makeText(getActivity(), "Upload Successful", Toast.LENGTH_SHORT).show();
Intent intent = new Intent(getActivity(), AfterPostActivity.class);
intent.putExtra("prdid",post_id);
startActivity(intent);
getActivity().finish();
}
}
private void loadNext(){
System.out.println(“sammy_reach_loadNext”);
如果(finalImages.size()>0){
System.out.println(“sammys_imagelist_后面:”+finalImages.size());
字符串路径=finalImages.get(0);
System.out.println(“sammys\u current\u pic\u path”+path);
新建上载SingleImage(path).execute();
}否则{
文件目录=新文件(文件路径);
if(dir.isDirectory()){
String[]children=dir.list();
如果(子项!=null){
for(int i=0;i
私有类上载SingleImage扩展异步任务{
私有HttpClient HttpClient;
私有HttpPost请求;
私人多方实体;
架线工;
字符串图像路径;
位图bm=null;
上载SingleImage(字符串imagepath){
this.imagepath=imagepath;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pd.setMessage(“请稍候”);
pd.show();
}
@凌驾
受保护的字符串doInBackground(无效…URL){
试一试{
httpClient=新的DefaultHttpClient();
postRequest=新的HttpPost(Utility.POSTPRODIMAGES);
reqEntity=新的多端口(HttpMultipartMode.BROWSER_兼容);
要求实体添加部件(“id”,新的StringBody(post_id));
Log.e(“sammy_inParam_post_id”,“*******”+post_id);
bm=BitmapFactory.decodeFile(imagepath);
如果(bm!=null){
ByteArrayOutputStream bos1=新建ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG,100,bos1);
字节[]数据1=bos1.toByteArray();
字符串imgName=“myprod.jpg”;
ByteArrayBody bab=新的ByteArrayBody(数据1,imgName);
请求实体添加部分(“图像”,bab);
}
postRequest.setEntity(reqEntity);
HttpResponse response=httpClient.execute(postRequest);
BufferedReader=新的BufferedReader(新的InputStreamReader(response.getEntity().getContent(),“UTF-8”);
字符串响应;
s=新的StringBuilder();
而((sResponse=reader.readLine())!=null){
s=s.append(sResponse);
}
//System.out.println(“sammy_Multiupload_doinback_Response:”+s);
}捕获(例外e){
System.out.println(“sammy_multiimage_doinback_excep”+e);
}
返回s.toString();
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
System.out.println(“sammys\u Multiupload\u onpostexec\u响应:+结果”);
试一试{
JSONObject jObj=新JSONObject(结果);
if(jObj.getString(“ACK”).等于(“1”)){
bm.recycle();
最后删除(0);
loadNext();
}
}捕获(JSONException e){
e、 printStackTrace();
}
}
}
它正在崩溃,因为您一次创建了大量的异步任务。如果一次运行的线程总数达到138,应用程序将崩溃。因此,您应该使用下面的executor
newuploadSingleImage(path).executeOnExecutor(AsyncTask.THREAD\u POOL\u EXECUTOR)
上述任务将一次执行5个任务,然后在前一个任务完成后启动下一个任务
下面是多个异步任务的参考
或者您可以使用其他一些http库ion
改装
我不知道出了什么问题,但我也遇到了同样的问题,当我开始使用网络库而不是asynktask时,问题就结束了
我用过,还有截击
有了它,你就不需要解码了,你只需要上传一个文件,你就不用担心asynktask的缺陷了
Asynctask不适用于长时间操作,也不适用于同时执行多个Asynctask,请尝试我的方法。您将非常满意我正在上载多个图像
。但我看到你正在上传文件。首先为它们创建一个位图。这需要很多内存。然后压缩到占用更多内存的字节数组
完全错误的方法
你应该上传文件的字节。取消BitmapFactory和中间位图
只需从FileInputStream中读入循环块,然后将这些块写入连接的OutputStream
在您的情况下,您可能可以添加一个新的FileBody()。您是否在清单中添加了android:largeHeap=“true”?您能否向我展示在截取中使用多个部件上载图像的代码@arjun\u sna检查一下,我使用了您建议的AsyncTask.THREAD\u POOL\u执行器
private class UploadSingleImage extends AsyncTask<Void, Void, String> {
private HttpClient httpClient;
private HttpPost postRequest;
private MultipartEntity reqEntity;
StringBuilder s;
String imagepath;
Bitmap bm=null;
UploadSingleImage(String imagepath) {
this.imagepath = imagepath;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
pd.setMessage("Please wait..");
pd.show();
}
@Override
protected String doInBackground(Void... urls) {
try {
httpClient = new DefaultHttpClient();
postRequest = new HttpPost(Utility.POSTPRODIMAGES);
reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
reqEntity.addPart("id", new StringBody(post_id));
Log.e("sammy_inParam_post_id", "******" + post_id);
bm = BitmapFactory.decodeFile(imagepath);
if (bm != null) {
ByteArrayOutputStream bos1 = new ByteArrayOutputStream();
bm.compress(Bitmap.CompressFormat.JPEG, 100, bos1);
byte[] data1 = bos1.toByteArray();
String imgName = "myprod.jpg";
ByteArrayBody bab = new ByteArrayBody(data1, imgName);
reqEntity.addPart("image" , bab);
}
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8"));
String sResponse;
s = new StringBuilder();
while ((sResponse = reader.readLine()) != null) {
s = s.append(sResponse);
}
//System.out.println("sammy_Multiupload_doinback_Response: " + s);
} catch (Exception e) {
System.out.println("sammy_multiimage_doinback_excep "+e);
}
return s.toString();
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
System.out.println("sammys_Multiupload_onpostexec_Response: " + result);
try {
JSONObject jObj = new JSONObject(result);
if (jObj.getString("ACK").equals("1")) {
bm.recycle();
finalImages.remove(0);
loadNext();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}