Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 上载多个图像时发生OutOfMemoryError_Android_Out Of Memory - Fatal编程技术网

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();
            }


        }
    }