【问题标题】:Multiple Images Uploads OOM issues [duplicate]多个图像上传OOM问题[重复]
【发布时间】:2020-01-17 21:47:05
【问题描述】:

以下代码将 4 张图片从手机/标签库上传到服务器 并将路径写入数据库。在测试它时,它目前是 如果它们是 150kb 及以下,则上传所有 4 张图片。问题来了 在我尝试上传 1Mb 图像时。该应用程序在加载时崩溃 iv的第二张图片。我已阅读此 Android 位图,但我不能 弄清楚如何在我的代码中实现它。请帮忙。

public class MainActivity extends AppCompatActivity {

    Bitmap bitmap1;
    Bitmap bitmap2;
    Bitmap bitmap3;
    Bitmap bitmap4;

    boolean check = true;

    Button SelectImageGallery1;
    Button SelectImageGallery2;
    Button SelectImageGallery3;
    Button SelectImageGallery4;

    Button UploadImageServer;

    ImageView imageView1;
    ImageView imageView2;
    ImageView imageView3;
    ImageView imageView4;

    EditText imageName1;
    EditText imageName2;
    EditText imageName3;
    EditText imageName4;

    ProgressDialog progressDialog;

    String GetImageNameEditText1;
    String GetImageNameEditText2;
    String GetImageNameEditText3;
    String GetImageNameEditText4;

    String ImageName1 = "image_name1";
    String ImageName2 = "image_name2";
    String ImageName3 = "image_name3";
    String ImageName4 = "image_name4";

    String ImagePath1 = "image_path1";
    String ImagePath2 = "image_path2";
    String ImagePath3 = "image_path3";
    String ImagePath4 = "image_path4";

    String ServerUploadPath = "http://ny.com/multiple4/uploadmultiple4.php";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView1 = (ImageView) findViewById(R.id.imageView1);
        imageView2 = (ImageView) findViewById(R.id.imageView2);
        imageView3 = (ImageView) findViewById(R.id.imageView3);
        imageView4 = (ImageView) findViewById(R.id.imageView4);

        imageName1 = (EditText) findViewById(R.id.editTextImageName1);
        String strImageName1 = imageName1.getText().toString();
        if (TextUtils.isEmpty(strImageName1)) {
            imageName1.setError("Image Name Must Be Entered");
        }
        imageName2 = (EditText) findViewById(R.id.editTextImageName2);
        String strImageName2 = imageName2.getText().toString();
        if (TextUtils.isEmpty(strImageName2)) {
            imageName2.setError("Image Name Must Be Entered");
        }
        imageName3 = (EditText) findViewById(R.id.editTextImageName3);
        String strImageName3 = imageName3.getText().toString();
        if (TextUtils.isEmpty(strImageName3)) {
            imageName3.setError("Image Name Must Be Entered");
        }
        imageName4 = (EditText) findViewById(R.id.editTextImageName4);
        String strImageName4 = imageName4.getText().toString();
        if (TextUtils.isEmpty(strImageName4)) {
            imageName4.setError("Image Name Must Be Entered");
        }

        SelectImageGallery1 = (Button) findViewById(R.id.buttonSelect1);
        SelectImageGallery2 = (Button) findViewById(R.id.buttonSelect2);
        SelectImageGallery3 = (Button) findViewById(R.id.buttonSelect3);
        SelectImageGallery4 = (Button) findViewById(R.id.buttonSelect4);

        UploadImageServer = (Button) findViewById(R.id.buttonUpload);

        SelectImageGallery1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image1 From Gallery"), 1);

            }
        });

        SelectImageGallery2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image4 From Gallery"), 2);
            }
        });

        SelectImageGallery3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image3 From Gallery"), 3);

            }
        });

        SelectImageGallery4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Image4 From Gallery"), 4);

            }
        });

        UploadImageServer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                GetImageNameEditText1 = imageName1.getText().toString();
                GetImageNameEditText2 = imageName2.getText().toString();
                GetImageNameEditText3 = imageName3.getText().toString();
                GetImageNameEditText4 = imageName4.getText().toString();
                ImageUploadToServerFunction();
            }
        });

    }

    @Override
    protected void onActivityResult(int RC, int RQC, Intent I) {
        super.onActivityResult(RC, RQC, I);
        if (RC == 1 && RQC == RESULT_OK && I != null && I.getData() != null) {
            Uri uri = I.getData();
            try {
                bitmap1 = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                //bitmap1 = MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                imageView1.setImageBitmap(bitmap1);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }

        if (RC == 2 && RQC == RESULT_OK && I != null && I.getData() != null) {
            Uri uri = I.getData();
            try {
                bitmap2 = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                //bitmap1 =
                MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                imageView2.setImageBitmap(bitmap2);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }

        if (RC == 3 && RQC == RESULT_OK && I != null && I.getData() != null) {
            Uri uri = I.getData();
            byte[] imageAsBytes = null;
            try {
                bitmap3 = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                //bitmap1 =
                MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                imageView3.setImageBitmap(bitmap3);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
        if (RC == 4 && RQC == RESULT_OK && I != null && I.getData() != null) {
            Uri uri = I.getData();
            try {
                bitmap4 = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                //bitmap1 =
                MediaStore.Images.Media.getBitmap(getContentResolver(), filePath);
                imageView4.setImageBitmap(bitmap4);
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
    }
    public String getStringImage1(Bitmap bitmap1) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap1.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage1 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage1;
    }

    public String getStringImage2(Bitmap bitmap2) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap2.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage2 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage2;
    }
    public String getStringImage3(Bitmap bitmap3) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap3.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage3 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage3;
    }

    public String getStringImage4(Bitmap bitmap4) {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap4.compress(Bitmap.CompressFormat.JPEG, 60, baos);
        byte[] imageBytes = baos.toByteArray();
        String encodedImage4 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
        return encodedImage4;
    }

    public void ImageUploadToServerFunction() {
        final String imageName1 = GetImageNameEditText1.trim();
        final String imageName2 = GetImageNameEditText2.trim();
        final String imageName3 = GetImageNameEditText3.trim();
        final String imageName4 = GetImageNameEditText4.trim();
        final String imageView1 = getStringImage1(bitmap1);
        final String imageView2 = getStringImage2(bitmap2);
        final String imageView3 = getStringImage3(bitmap3);
        final String imageView4 = getStringImage4(bitmap4);

        class AsyncTaskUploadClass extends AsyncTask <Void, Void, String> {

            @Override
            protected void onPreExecute() {

                super.onPreExecute();

                progressDialog = ProgressDialog.show(MainActivity.this, "Image is Uploading", "Please Wait", false, false);
            }

            @Override
            protected void onPostExecute(String string1) {

                super.onPostExecute(string1);

                // Dismiss the progress dialog after done uploading.
                progressDialog.dismiss();

                // Printing uploading success message coming from server on android app.
                Toast.makeText(MainActivity.this, string1, Toast.LENGTH_LONG).show();

                // Setting image as transparent after done uploading.
                ImageView cleared1 = (ImageView) findViewById(R.id.imageView1);
                cleared1.setImageResource(android.R.color.transparent);

                ImageView cleared2 = (ImageView) findViewById(R.id.imageView2);
                cleared2.setImageResource(android.R.color.transparent);

                ImageView cleared3 = (ImageView) findViewById(R.id.imageView3);
                cleared3.setImageResource(android.R.color.transparent);

                ImageView cleared4 = (ImageView) findViewById(R.id.imageView4);
                cleared4.setImageResource(android.R.color.transparent);

            }

            @Override
            protected String doInBackground(Void...params) {
                ImageProcessClass imageProcessClass = new ImageProcessClass();
                HashMap <String, String> HashMapParams = new HashMap <String, String> ();
                HashMapParams.put(ImageName1, imageName1);
                HashMapParams.put(ImageName2, imageName2);
                HashMapParams.put(ImageName3, imageName3);
                HashMapParams.put(ImageName4, imageName4);
                HashMapParams.put(ImagePath1, imageView1);
                HashMapParams.put(ImagePath2, imageView2);
                HashMapParams.put(ImagePath3, imageView3);
                HashMapParams.put(ImagePath4, imageView4);

                String FinalData = imageProcessClass.ImageHttpRequest(ServerUploadPath, HashMapParams);
                return FinalData;
            }
        }
        AsyncTaskUploadClass AsyncTaskUploadClassOBJ = new
        AsyncTaskUploadClass();
        AsyncTaskUploadClassOBJ.execute();
    }

    public class ImageProcessClass {
        public String ImageHttpRequest(String
        requestURL, HashMap <String, String> PData) {
            StringBuilder stringBuilder = new StringBuilder();
            try {
                URL url;
                HttpURLConnection httpURLConnectionObject;
                OutputStream OutPutStream;
                BufferedWriter bufferedWriterObject;
                BufferedReader bufferedReaderObject;
                int RC;
                url = new URL(requestURL);
                httpURLConnectionObject = (HttpURLConnection)
                url.openConnection();
                httpURLConnectionObject.setReadTimeout(19000);
                httpURLConnectionObject.setConnectTimeout(19000);
                httpURLConnectionObject.setRequestMethod("POST");
                httpURLConnectionObject.setDoInput(true);
                httpURLConnectionObject.setDoOutput(true);
                OutPutStream = httpURLConnectionObject.getOutputStream();
                bufferedWriterObject = new BufferedWriter(
                new OutputStreamWriter(OutPutStream, "UTF-8"));
                bufferedWriterObject.write(bufferedWriterDataFN(PData));
                bufferedWriterObject.flush();
                bufferedWriterObject.close();
                OutPutStream.close();
                RC = httpURLConnectionObject.getResponseCode();
                if (RC == HttpsURLConnection.HTTP_OK) {
                    bufferedReaderObject = new BufferedReader(new
                    InputStreamReader(httpURLConnectionObject.getInputStream()));
                    stringBuilder = new StringBuilder();
                    String RC2;
                    while ((RC2 = bufferedReaderObject.readLine()) != null) {
                        stringBuilder.append(RC2);
                    }
                }
            } catch(Exception e) {
                e.printStackTrace();
            }
            return stringBuilder.toString();
        }

        private String bufferedWriterDataFN(HashMap <String, String> HashMapParams) throws UnsupportedEncodingException {
            StringBuilder stringBuilderObject;
            stringBuilderObject = new StringBuilder();
            for (Map.Entry < String, String > KEY: HashMapParams.entrySet()) {
                if (check) check = false;
                else stringBuilderObject.append("&");

                stringBuilderObject.append(URLEncoder.encode(KEY.getKey(), "UTF-8"));
                stringBuilderObject.append("=");

                stringBuilderObject.append(URLEncoder.encode(KEY.getValue(), "UTF-8"));
            }

            return stringBuilderObject.toString();
        }
    }
}

【问题讨论】:

    标签: java android


    【解决方案1】:

    Out Of Memory 如果您尝试将bitmap 资源设置为ImageView 的图像,则可能会出现Out Of Memory,因为资源本身可能没有那么大,如您所说的 1MB,但实际上它被夸大了尺寸会大很多,因为位图在提取数据以进行复制时的工作方式。

    我指的是 Android 开发者平台中的 Loading Large Bitmaps Efficiently 内容,以便让您更好地了解我的建议,但您可能还想更广泛地了解loading Bitmaps in Android

    我建议您尝试使用 BitmapFactory.Options 类,以最大限度地减少用作缓存以加载位图资源的虚拟内存。

    最终你需要:

    • 读取位图尺寸和类型
    • 根据您的 ImageView 期望(大小)加载缩小版本或内存中的适当版本

    【讨论】:

    • 先生,我该如何在上面的代码中做到这一点?
    • 检查您的 ImageView-s 有多大,并尝试将位图缩小到大约这些尺寸(高度/宽度)
    猜你喜欢
    • 2015-08-06
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    • 2015-05-26
    • 2013-11-06
    • 2018-08-01
    • 2013-10-12
    相关资源
    最近更新 更多