java.lang.StackOverflowError: stack size 8MB while

2019-08-21 15:31发布

问题:

I am trying to capture image from camera and set the image as background for a custom view so I can draw on it.but i got an error. Below is the code causing the error ,could anybody guide me on the right path.

 private CustomView mCustomView;
    Uri uri;
    File file;
    Drawable myDrawable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_draw_view);

        mCustomView = (CustomView)findViewById(R.id.custom_view);
        //mCustomView.setBackground(mCustomView,R.drawable.one);
        //mCustomView.setBackgroundResource();
        Bundle extras = getIntent().getExtras();
        uri = Uri.parse(extras.getString("imageUri"));

        try {
            InputStream inputStream = getContentResolver().openInputStream(uri);
            myDrawable = Drawable.createFromStream(inputStream, uri.toString() );

            mCustomView.setBackgroundResource(myDrawable);
        } catch (FileNotFoundException e) {
            myDrawable = getResources().getDrawable(R.drawable.one);
        }




    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.undo:
                mCustomView.onClickUndo();
                return true;
            case R.id.save:
                saveThisDrawing();
                return true;
        }
        return super.onOptionsItemSelected(item);
    }

    public void saveThisDrawing()
    {
        if (requestPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
            String path = Environment.getExternalStorageDirectory().toString();
            path = path + "/" + getString(R.string.app_name);
            File dir = new File(path);
            //save drawing
            mCustomView.setDrawingCacheEnabled(true);

            //attempt to save
            String imTitle = "Drawing" + "_" + System.currentTimeMillis() + ".png";
            String imgSaved = MediaStore.Images.Media.insertImage(
                    getContentResolver(), mCustomView.getDrawingCache(),
                    imTitle, "a drawing");

            try {
                if (!dir.isDirectory() || !dir.exists()) {
                    dir.mkdirs();
                }
                mCustomView.setDrawingCacheEnabled(true);
                File file = new File(dir, imTitle);
                FileOutputStream fOut = new FileOutputStream(file);
                Bitmap bm = mCustomView.getDrawingCache();
                bm.compress(Bitmap.CompressFormat.PNG, 100, fOut);


            } catch (FileNotFoundException e) {
                e.printStackTrace();
                AlertDialog.Builder alert = new AlertDialog.Builder(this);
                alert.setTitle("Uh Oh!");
                alert.setMessage("Oops! Image could not be saved. Do you have enough space in your device?1");
                alert.setPositiveButton("OK", null);
                alert.show();

            }

            if (imgSaved != null) {
                Toast savedToast = Toast.makeText(getApplicationContext(),
                        "Drawing saved to Gallery!", Toast.LENGTH_SHORT);
                savedToast.show();
            }

            mCustomView.destroyDrawingCache();
        }
    }
    private boolean requestPermission(String writeExternalStorage) {
        if(Build.VERSION.SDK_INT >= 24){

            requestPermissions(new String[]{Manifest.permission.CAMERA,Manifest.permission.WRITE_EXTERNAL_STORAGE},2);
            return true;
        }
        return true;
    }

My CustomView code is as below:

public class CustomView extends View {

    private static final String LOG_CAT = CustomView.class.getSimpleName();

    //drawing path
    private Path drawPath;

    //defines what to draw
    private Paint canvasPaint;

    //defines how to draw
    private Paint drawPaint;

    //initial color
    private int paintColor = 0xFF660000;

    private Paint _paintBlur;


    //canvas - holding pen, holds your drawings
    //and transfers them to the view
    private Canvas drawCanvas;

    //canvas bitmap
    private Bitmap canvasBitmap;

    //brush size
    private float currentBrushSize, lastBrushSize;

    private ArrayList<Path> paths = new ArrayList<Path>();
    private ArrayList<Path> undonePaths = new ArrayList<Path>();
    private float mX, mY;
    private static final float TOUCH_TOLERANCE = 4;

    private void init(){
        currentBrushSize = 20;
        lastBrushSize = currentBrushSize;

        drawPath = new Path();
        drawPaint = new Paint();
        drawPaint.setColor(paintColor);
        drawPaint.setAntiAlias(true);
        drawPaint.setStrokeWidth(currentBrushSize);
        drawPaint.setStyle(Paint.Style.STROKE);
        drawPaint.setStrokeJoin(Paint.Join.ROUND);
        drawPaint.setStrokeCap(Paint.Cap.ROUND);

        canvasPaint = new Paint(Paint.DITHER_FLAG);

        this._paintBlur = new Paint();
        this._paintBlur.set(drawPaint);
        this._paintBlur.setAntiAlias(true);
        this._paintBlur.setDither(true);
        this._paintBlur.setStyle(Paint.Style.STROKE);
        this._paintBlur.setStrokeJoin(Paint.Join.ROUND);
        this._paintBlur.setStrokeCap(Paint.Cap.ROUND);
        this._paintBlur.setColor(Color.RED);
        this._paintBlur.setStrokeWidth(6);
        this._paintBlur.setMaskFilter(new BlurMaskFilter(10.0F, BlurMaskFilter.Blur.OUTER));


    }

    public void setBackgroundResource(Drawable drawable){


        setBackgroundResource(drawable);

    }

  /*  public void setBackground(View view, Drawable background) {
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            view.setBackground(background);
        } else {
            view.setBackgroundDrawable(background);
        }
    }*/

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);

        init();
       // setBackgroundResource(R.drawable.one);
    }

    @Override
    protected void onDraw(Canvas canvas) {


        for (Path p : paths) {
            canvas.drawPath(p, drawPaint);

        }


        canvas.drawPath(drawPath, drawPaint);
       // canvas.drawBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.one), 0, 0, canvasPaint);
       // canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
       //create canvas of certain device size.
        super.onSizeChanged(w, h, oldw, oldh);


        //create Bitmap of certain w,h
       canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);

        //apply bitmap to graphic to start drawing.
        drawCanvas = new Canvas(canvasBitmap);



    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float touchX = event.getX();
        float touchY = event.getY();

        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                touch_start(touchX, touchY);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE:
                touch_move(touchX, touchY);
                invalidate();
                break;
            case MotionEvent.ACTION_UP:
                touch_up();
                invalidate();
                break;
            default:
                return false;
        }
        return true;
    }


    private void touch_start(float x, float y) {
        undonePaths.clear();
        drawPath.reset();
        drawPath.moveTo(x, y);
        mX = x;
        mY = y;
    }

    private void touch_up() {
        drawPath.lineTo(mX, mY);
        drawCanvas.drawPath(drawPath, drawPaint);
        paths.add(drawPath);
        drawPath = new Path();

    }

    private void touch_move(float x, float y) {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);
        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            drawPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
            mX = x;
            mY = y;
        }
    }


    public void onClickUndo () {
       if (paths.size()>0)
        {
            undonePaths.add(paths.remove(paths.size()-1));
            invalidate();
        }

    }

Only the Error Part:

2019-04-14 20:16:26.196 15300-15300/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.undopaint1, PID: 15300
    java.lang.StackOverflowError: stack size 8MB
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
2019-04-14 20:16:26.200 15300-15300/? E/AndroidRuntime:     at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
2019-04-14 20:16:26.560 15300-15314/? I/zygote64: Background concurrent copying GC freed 339(60KB) AllocSpace objects, 0(0B) LOS objects, 28% free, 58MB/82MB, paused 147.156ms total 517.058ms
    , len = 6
2019-04-14 20:16:27.013 15300-15314/? I/zygote64: Background concurrent copying GC freed 528864(56MB) AllocSpace objects, 1(2MB) LOS objects, 30% free, 55MB/79MB, paused 398us total 280.785ms
2019-04-14 20:16:27.426 15300-15314/? I/zygote64: Background concurrent copying GC freed 528919(55MB) AllocSpace objects, 0(0B) LOS objects, 31% free, 52MB/76MB, paused 547us total 240.932ms
2019-04-14 20:16:27.579 15300-15300/? I/chatty: uid=10307(u0_a307) com.example.undopaint1 identical 3038 lines
2019-04-14 20:16:27.580 15300-15300/? E/AndroidRuntime:     at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
2019-04-14 20:16:27.580 15300-15300/? E/AndroidRuntime:     at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.CustomView.setBackgroundResource(CustomView.java:85)
        at com.example.undopaint1.DrawView.onCreate(DrawView.java:44)
        at android.app.Activity.performCreate(Activity.java:7383)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1218)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3256)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3411)
        at android.app.ActivityThread.-wrap12(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1994)
        at android.os.Handler.dispatchMessage(Handler.java:108)
        at android.os.Looper.loop(Looper.java:166)
        at android.app.ActivityThread.main(ActivityThread.java:7529)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:245)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:921)
2019-04-14 20:16:27.863 15300-15314/? I/zygote64: Background concurrent copying GC freed 484245(50MB) AllocSpace objects, 4(212KB) LOS objects, 25% free, 70MB/94MB, paused 430us total 263.626

If their is any alternative to set an image and also undo logic is not affected please guide me as I not an expert.This my first time dealing with Images and custom views.

回答1:

The best way to work with image is to use Piccasso ,

Picasso.get().load(path or url).into(imageView);

and do never use huge images as background !

Create your drawable from the path :

Drawable d = Drawable.createFromPath(pathName)

And then resize it before you set it as background

Bitmap bitmap = ((BitmapDrawable) d).getBitmap();
// Scale it to 50 x 50
Drawable d = newBitmapDrawable(getResources(),Bitmap.createScaledBitmap(bitmap,50, 50, true));