рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЕрдиреБрдХреВрд▓рди рдХреИрд╕реЗ рдХрд░реЗрдВ рдЬрдм 6 рдЫрд╡рд┐рдпрд╛рдВ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ 15-16 рдкреАрдПрдирдЬреА рдХреЗ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдордврд╝рд╛ рд╣реБрдЖ рд╣реИ, рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдПрдХ рдЖрдЙрдЯрдСрдлрд╝рдореИрд░реАрдПрдХреНрд╕ рдЕрдкрд╡рд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдмрд┐рдирд╛?

рдЕрдкрдирд╛ рдкрд╛рд▓рддреВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп, рдореБрдЭреЗ рдЗрдореЗрдЬ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдореИрдВ Google рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫреЗ Googlecases рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЕрдкрдиреЗ рд░реЗрдХ рдкрд░ рдЪрд▓рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЕрдкрдиреЗ рджрдо рдкрд░ рдПрдХ рд╕рд╛рдЗрдХрд┐рд▓ рдХрд╛ рдЖрд╡рд┐рд╖реНрдХрд╛рд░ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдЬрд╛рд╡рд╛ рд╕реЗ рдХреЛрдЯрд▓рд┐рди рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╡рд╛рд╕рди рдерд╛, рдЗрд╕рд▓рд┐рдП рдХрд┐рд╕реА рдмрд┐рдВрджреБ рдкрд░ рдХреЛрдб рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдХрд╛рд░реНрдп
рдЬрд┐рдо рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдЖрд╡реЗрджрдиред рдЖрд╡реЗрджрди рдХреНрд░рдо рдореЗрдВ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХреЗ рдХрд╛рдо рдХрд╛ рдПрдХ рдирдХреНрд╢рд╛ рдмрдирд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред
рджреЛ рд▓рд┐рдВрдЧ: рдПрдо рдФрд░ рдЬреАред рд╡рд┐рдХрд▓реНрдк рдПрдо рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ, рдХреНрдпреЛрдВрдХрд┐ рдПрдо рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕рдорд╛рди рд╣реИред
6 рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: 3 рдЕрд╡рдзрд┐ (рдПрдХ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рддреНрд░, рдкреНрд░рддрд┐ рд╕рдкреНрддрд╛рд╣, рдкреНрд░рддрд┐ рдорд╛рд╣) x 2 рджреГрд╢реНрдп (рд╕рд╛рдордиреЗ, рдкреАрдЫреЗ)

рдЗрд╕ рддрд░рд╣ рдХреА рдкреНрд░рддреНрдпреЗрдХ рдЫрд╡рд┐ рдореЗрдВ рд╕рд╛рдордиреЗ рдХреЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдорд╛рдВрд╕рдкреЗрд╢реА рд╕рдореВрд╣реЛрдВ рдХреА 15 рдЫрд╡рд┐рдпрд╛рдВ рдФрд░ рдкреАрдЫреЗ рдХреЗ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП 14 рдЪрд┐рддреНрд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдиреАрдВрд╡ (рд╕рд┐рд░, рд╣рд╛рде рдФрд░ рдкреИрд░) рдХреА рдкреНрд▓рд╕ 1 рдЫрд╡рд┐ред рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░, рд╕рд╛рдордиреЗ рдХрд╛ рджреГрд╢реНрдп рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ 16 рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкреАрдЫреЗ рд╕реЗ, 15 рд╕реЗ рд╕реБрдкрд░рд┐рдордВрдкреЛрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рджреЛрдиреЛрдВ рдкрдХреНрд╖реЛрдВ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 23 рдорд╛рдВрд╕рдкреЗрд╢реА рд╕рдореВрд╣ (15 + 14! = 23 рдХреЗ рд╕рд╛рде рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг - рдХреБрдЫ рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпрд╛рдВ рджреЛрдиреЛрдВ рддрд░рдл "рджреГрд╢реНрдпрдорд╛рди" рд╣реИрдВ)ред
рдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:
- рдкреВрд░реНрдг рд╡рд░реНрдХрдЖрдЙрдЯ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, HashMap <рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдлреНрд▓реЛрдЯ> рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕реНрдЯреНрд░рд┐рдВрдЧ рдорд╛рдВрд╕рдкреЗрд╢реА рд╕рдореВрд╣ рдХрд╛ рдирд╛рдо рд╣реИ, рдлреНрд▓реЛрдЯ 0 рд╕реЗ 10 рддрдХ рд▓реЛрдб рдХреА рдбрд┐рдЧреНрд░реА рд╣реИред
- 23 рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреЗрд╢реА 0 рд╕реЗ рд░рдВрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (10) (рдЕрдзрд┐рдХрддрдо рд▓реЛрдб)ред
- рджреЛ рдЫрд╡рд┐рдпреЛрдВ (рд╕рд╛рдордиреЗ, рдкреАрдЫреЗ) рдореЗрдВ рдУрд╡рд░рд▓реЗ рд░рд┐рдкреЗрдВрдЯреЗрдб рдорд╛рдВрд╕рдкреЗрд╢реА рдЫрд╡рд┐рдпреЛрдВред
- рд╣рдо рд╕рднреА 6 рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдмрдЪрд╛рддреЗ рд╣реИрдВред

24-рдмрд┐рдЯ рдореЛрдб рдХреЗ рд╕рд╛рде рдЖрдХрд╛рд░ 1500x1500 px рдХреЗ 31 (16 + 15) рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, 31x1500x1500x24bit = 199 рдПрдордмреА рд░реИрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрдм рдЖрдк ~ 30-40 MB рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ OutOfememoryException рдорд┐рд▓рддреА рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, рдЖрдк рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рд▓реЛрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЛ рд░рд┐рд╕реЗрдкреНрд╢рди рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдУрд╡рд░рд▓реЗ рдЫрд╡рд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ:
рдкреВрд░реНрдг рд╡рд░реНрдХрдЖрдЙрдЯ рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рд╛рд╢рдк <рд╕реНрдЯреНрд░рд┐рдВрдЧ, рдлреНрд▓реЛрдЯ>, рд╕реНрдЯреНрд░рд┐рдВрдЧ - рдорд╛рдВрд╕рдкреЗрд╢реА, рдлреНрд▓реЛрдЯ - 0 рд╕реЗ 10 рддрдХ рд▓реЛрдб рд╕реНрддрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
6 рдЫрд╡рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рдЪрдХреНрд░:
- BitmapFactory.decodeResource () рд╕рдВрд╕рд╛рдзрди рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
- 23 рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреЗрд╢реА 0 рд╕реЗ рд░рдВрдЧ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ (10) (рдЕрдзрд┐рдХрддрдо рд▓реЛрдб)ред
- рдПрдХ рдХреИрдирд╡рд╕ рдкрд░ рдУрд╡рд░рд▓реЗ рд░рд┐рдкреЗрдВрд╕реНрдб рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпреЛрдВ рдХреА рдЫрд╡рд┐рдпреЛрдВред
- Bitmap.recycle () рдиреЗ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреЛ рдореБрдХреНрдд рдХрд┐рдпрд╛ред
рд╣рдо AsyncTask рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдЯрд╛рд╕реНрдХ рдореЗрдВ, рджреЛ рдЗрдореЗрдЬ рдХреНрд░рдордмрджреНрдз рд░реВрдк рд╕реЗ рдмрдирд╛рдИ рдЬрд╛рддреА рд╣реИрдВ: рдПрдХ рдлреНрд░рдВрдЯ рд╡реНрдпреВ рдФрд░ рдПрдХ рдмреИрдХ рд╡реНрдпреВред
private class BitmapMusclesTask extends AsyncTask<Void, Void, DoubleMusclesBitmaps> { private final WeakReference<HashMap<String, Float>> musclesMap; BitmapMusclesTask(HashMap<String, Float> musclesMap) { this.musclesMap = new WeakReference<>(musclesMap); } @Override protected DoubleMusclesBitmaps doInBackground(Void... voids) { DoubleMusclesBitmaps bitmaps = new DoubleMusclesBitmaps(); bitmaps.bitmapBack = createBitmapMuscles(musclesMap.get(), false); bitmaps.bitmapFront = createBitmapMuscles(musclesMap.get(), true); return bitmaps; } @Override protected void onPostExecute(DoubleMusclesBitmaps bitmaps) { super.onPostExecute(bitmaps); Uri uriBack = saveBitmap(bitmaps.bitmapBack); Uri uriFront = saveBitmap(bitmaps.bitmapFront); bitmaps.bitmapBack.recycle(); bitmaps.bitmapFront.recycle(); if (listener != null) listener.onUpdate(uriFront, uriBack); } } public class DoubleMusclesBitmaps { public Bitmap bitmapFront; public Bitmap bitmapBack; }
рд╕рд╣рд╛рдпрдХ рд╡рд░реНрдЧ DoubleMusclesBitmaps рдХреЛ рдХреЗрд╡рд▓ рджреЛ рдмрд┐рдЯрдореИрдк рдЪрд░ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╕рд╛рдордиреЗ рдХрд╛ рджреГрд╢реНрдп рдФрд░ рдкреАрдЫреЗ рдХрд╛ рджреГрд╢реНрдпред рдЖрдЧреЗ рджреЗрдЦрддреЗ рд╣реБрдП, DoubleMusclesBitmaps рдЬрд╛рд╡рд╛ рд╡рд░реНрдЧ рдХреЛ рдХреЛрдЯрд▓рд┐рди рдореЗрдВ рдЬреЛрдбрд╝реА <Bitmap, Bitmap> рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдбреНрд░рд╛рдЗрдВрдЧ
рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рд░рдВрдЧ color.xmlред
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="muscles_color0">#BBBBBB</color> <color name="muscles_color1">#ffb5cf</color> <color name="muscles_color2">#fda9c6</color> <color name="muscles_color3">#fa9cbe</color> <color name="muscles_color4">#f890b5</color> <color name="muscles_color5">#f583ac</color> <color name="muscles_color6">#f377a4</color> <color name="muscles_color7">#f06a9b</color> <color name="muscles_color8">#ee5e92</color> <color name="muscles_color9">#eb518a</color> <color name="muscles_color10">#e94581</color> </resources>
рдПрдХ рджреГрд╢реНрдп рдмрдирд╛рдПрдВ
public Bitmap createBitmapMuscles(HashMap<String, Float> musclesMap, Boolean isFront) { Bitmap musclesBitmap = Bitmap.createBitmap(1500, 1500, Bitmap.Config.ARGB_8888); Canvas resultCanvas = new Canvas(musclesBitmap); for (HashMap.Entry entry : musclesMap.entrySet()) { int color = Math.round((float) entry.getValue());
рдПрдХрд▓ рдорд╛рдВрд╕рдкреЗрд╢реА рдУрд╡рд░рд▓реЗ
private void drawMuscleElement(Canvas resultCanvas, String drawableName, @ColorInt int color) { PorterDuff.Mode mode = PorterDuff.Mode.SRC_IN; Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); Bitmap bitmapDst = BitmapFactory.decodeResource(context.getResources(), context.getResources().getIdentifier(drawableName, "drawable", context.getPackageName())); bitmapDst = Bitmap.createScaledBitmap(bitmapDst, 1500, 1500, true); paint.setColorFilter(new PorterDuffColorFilter(color, mode)); resultCanvas.drawBitmap(bitmapDst, 0, 0, paint); bitmapDst.recycle();
рд╣рдо 3 рдЬреЛрдбрд╝реА рдЫрд╡рд┐рдпреЛрдВ рдХреА рдкреАрдврд╝реА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
private BitmapMusclesTask taskLast; private BitmapMusclesTask taskWeek; private BitmapMusclesTask taskMonth; private void startImageGenerating(){ taskLast = new BitmapMusclesTask(mapLast); taskLast.execute(); taskWeek = new BitmapMusclesTask(mapWeek); taskWeek.execute(); taskMonth = new BitmapMusclesTask(mapMonth); taskMonth.execute(); }
рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ IGemGenerating ():
> start 1549350950177 > finish 1549350959490 diff=9313 ms
рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдкрдврд╝рдиреЗ рдХреЗ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдореЗрдВ рдмрд╣реБрдд рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЬреЛрдбрд╝реА рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ 29 рдкреАрдПрдирдЬреА рдлрд╛рдЗрд▓реЗрдВ рдбрд┐рдХреЛрдб рдХреА рдЬрд╛рддреА рд╣реИрдВред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЫрд╡рд┐рдпрд╛рдВ рдмрдирд╛рдиреЗ рдХреА рдХреБрд▓ рд▓рд╛рдЧрдд рдореЗрдВ рд╕реЗ, рдмрд┐рдЯрдореИрдкрдлреИрдХреНрдЯреНрд░реА.рдСрдбрдмреНрд▓реЙрдХ рд╕реЛрд░реНрд╕ () рдлрд╝рдВрдХреНрд╢рди рдЦрд░реНрдЪ рдХрд░рддрд╛ рд╣реИ ~ 75% рд╕рдордп: ~ 6960 рдПрдордПрд╕ред
рд╡рд┐рдкрдХреНрд╖:
- рдореБрдЭреЗ рд╕рдордп-рд╕рдордп рдкрд░ OutOfMemoryException рдорд┐рд▓рддреА рд╣реИред
- рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ 9 рд╕реЗрдХрдВрдб рд╕реЗ рдЕрдзрд┐рдХ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдПрдореБрд▓реЗрдЯрд░ (!) рдкрд░ рд╣реИ "рдФрд╕рдд" (рдкреБрд░рд╛рдиреА рдЦрд╛рди) рдлреЛрди рдореЗрдВ рдпрд╣ 20 рд╕реЗрдХрдВрдб рддрдХ рдкрд╣реБрдВрдЪ рдЧрдпрд╛ред
- рд╕рднреА рдкрд░рд┐рдгрд╛рдореА [рдореЗрдореЛрд░реА] рд▓реАрдХ рдХреЗ рд╕рд╛рде AsyncTaskред
рдкреЗрд╢реЗрд╡рд░реЛрдВ:
рдкреНрд░рд╛рдпрд┐рдХрддрд╛ рдХреЗ рд╕рд╛рде (1-OutOfMemoryException) рдЪрд┐рддреНрд░ рдЦреАрдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВред
рдЖрдВрд╕рд░-рдХреА рд╕реЗрд╡рд╛ рдореЗрдВ AsyncTask
AsyncTask рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, IntentServie рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рдЪрд┐рддреНрд░ рдмрдирд╛рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рд╕реЗрд╡рд╛ рдкреВрд░реА рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЕрдЧрд░ рдмреНрд░реЙрдбрдХрд╛рд╕реНрдЯрд╕реАрд╡рд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рднреА рдЫрд╣ рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЙрд░рдИ рдорд┐рд▓ рдЬрд╛рддреЗ рд╣реИрдВ, рдЕрдиреНрдпрдерд╛ рдЫрд╡рд┐рдпрд╛рдВ рдмрд╕ рдмрдЪ рдЬрд╛рддреА рдереАрдВ рддрд╛рдХрд┐ рдЕрдЧрд▓реА рдмрд╛рд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЦреЛрд▓рддрд╛ рд╣реИ, рддреЛ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЙрд╕реА рд╕рдордп, рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдореЗрдВ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реБрдЖ, рд▓реЗрдХрд┐рди рдПрдХ рдорд╛рдЗрдирд╕ - рдореЗрдореЛрд░реА рд▓реАрдХ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛, рджреЛ рдФрд░ рдорд╛рдЗрдирд╕ рдереЗред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдРрд╕реЗ рд╕рдордп рдХреЗ рд▓рд┐рдП рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЙрдореНрдореАрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд░рдирд╛, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЕрд╕рдВрднрд╡ рд╣реИред рдЕрдиреБрдХреВрд▓рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рддрд░реАрдХреЗ:
- рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдгред
- LruCache рдЬреЛрдбрд╝рдирд╛ред
рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг
рд╕рднреА рд╕реНрд░реЛрдд рдкреАрдПрдирдЬреА рд╕рдВрд╕рд╛рдзрди 1500x1500 рдкреАрдПрдХреНрд╕ рдЖрдХрд╛рд░ рдХреЗ рд╣реИрдВред рдЙрдиреНрд╣реЗрдВ 1080x1080 рдкрд░ рдХрдо рдХрд░реЗрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреВрд╕рд░реА рддрд╕реНрд╡реАрд░ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдб рдЪреМрдХреЛрд░ рд╣реИрдВ, рдорд╛рдВрд╕рдкреЗрд╢рд┐рдпрд╛рдВ рдЬрдЧрд╣ рдореЗрдВ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧреА рдкрд┐рдХреНрд╕реЗрд▓ рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдХреНрд╖реЗрддреНрд░ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗрддреЗ рд╣реИрдВред рдпрд╣ рддрдереНрдп рдХрд┐ рд╕рднреА рдорд╛рдВрд╕рдкреЗрд╢реА рд╕рдореВрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХрд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИрдВред рд╣рдо рд╕рднреА рд╕реНрд░реЛрдд рдХреЛрдбреЛрдВ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд (рдлрд╕рд▓) рдХрд╛рдЯрддреЗ рд╣реИрдВ, рдкреНрд░рддреНрдпреЗрдХ рдорд╛рдВрд╕рдкреЗрд╢реА рд╕рдореВрд╣ рдХреА рд╕реНрдерд┐рддрд┐ (x, y) рдХреЛ рд░рд┐рдХреЙрд░реНрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рдЗрд╕реЗ рд╕рд╣реА рдЬрдЧрд╣ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред
рдкрд╣рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рдорд╛рдВрд╕рдкреЗрд╢реА рд╕рдореВрд╣реЛрдВ рдХреА рд╕рднреА 29 рдЫрд╡рд┐рдпрд╛рдВ рдЖрдзрд╛рд░ рдкрд░ рдкреБрди: рдЕрдВрдХрд┐рдд рдФрд░ рд╕реБрдкрд░рд┐рдореНрдкреЛрдЬ рдХреА рдЧрдИрдВред рдЖрдзрд╛рд░ рдореЗрдВ рдХреЗрд╡рд▓ рд╕рд┐рд░, рд╣рд╛рде рдФрд░ рдкреИрд░ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рд╢рд╛рдорд┐рд▓ рдереЗред рд╣рдо рдЖрдзрд╛рд░ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ: рдЕрдм рдЗрд╕рдореЗрдВ рд╕рд┐рд░, рд╣рд╛рде рдФрд░ рдкреИрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рднреА рдЕрдиреНрдп рдорд╛рдВрд╕рдкреЗрд╢реА рд╕рдореВрд╣ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рдо рд╕рдм рдХреБрдЫ рдЧреНрд░реЗ color_muscle0 рдореЗрдВ рдкреЗрдВрдЯ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЙрди рдорд╛рдВрд╕рдкреЗрд╢реА рд╕рдореВрд╣реЛрдВ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдФрд░ рди рд▓рдЧрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ рдЬреЛ рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдереЗред
рдЕрдм рд╕рднреА рд╕реНрд░реЛрдд рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:

LruCache
рдореВрд▓ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рдж, рдХреБрдЫ рдиреЗ рдереЛрдбрд╝реА рд╕реА рдореЗрдореЛрд░реА рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рдХрд╛рд░рдг LruCache рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ .recycle () рд╡рд┐рдзрд┐ рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рдУрд╡рд░рд▓реЗ рдХреЗ рдмрд╛рдж рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ (рдЙрдиреНрд╣реЗрдВ рдореБрдХреНрдд рдирд╣реАрдВ рдХрд░рдирд╛) рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ред рд╣рдо рд╕реНрд░реЛрдд рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╕рд╛рде рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рдорд╛рдирддрд╛ рд╣реИ:
class LruCacheBitmap(val context: Context) { private val lruCache: LruCache<String, Bitmap> init { val maxMemory = (Runtime.getRuntime().maxMemory() / 1024).toInt() val cacheSize = maxMemory / 4 lruCache = object : LruCache<String, Bitmap>(cacheSize) { override fun sizeOf(key: String, bitmap: Bitmap): Int { return bitmap.byteCount } } } fun getBitmap(drawableName: String): Bitmap? { return if (lruCache.get(drawableName) != null) lruCache.get(drawableName) else decodeMuscleFile(drawableName) } fun clearAll() { lruCache.evictAll() } private fun decodeMuscleFile(drawableName: String): Bitmap? { val bitmap = BitmapFactory.decodeResource(context.resources, context.resources.getIdentifier(drawableName, "drawable", context.packageName)) if (bitmap != null) { lruCache.put(drawableName, bitmap) } return bitmap } }
рдЫрд╡рд┐рдпрд╛рдБ рддреИрдпрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рд╕рдВрд╕рд╛рдзрди рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдордиреЗ рдЬрд╛рд╡рд╛ рд╕реЗ рдХреЛрдЯрд▓рд┐рди рддрдХ рдХреЗ рдирд┐рд░реНрдмрд╛рдз рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдЪрд░реНрдЪрд╛ рдирд╣реАрдВ рдХреА, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реБрдЖред
Korutiny
IntentService рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЙрд▓рдмреИрдХ рдХреЗ рд╕рд╛рде рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рд╕реБрдЦрдж рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рдо рдореЗрдВ рдХреЛрдЯрд▓рд┐рди рдХреЗ рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рдЬреЛрдбрд╝реЗрдВред рд╣рдо рдЗрд╕ рдмрд╛рдд рдХреЛ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рдорд╣реАрдиреЛрдВ рдХреЗ рдмрд╛рдж, рдЙрддреНрдкрдиреНрди рдЪрд┐рддреНрд░реЛрдВ рдХреА рдЙрд░реА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдкрдХреЗ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдЕрдзрд┐рдХ рд╕реБрдЦрдж рд╣реЛрдЧрд╛ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЫрд╡рд┐ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рддреНрд╡рд░рдг рдиреЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрдИ рдирдП рд╕реНрдерд╛рдиреЛрдВ рдореЗрдВ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрднреНрдпрд╛рд╕ рдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдВ, рдФрд░ рди рдХреЗрд╡рд▓ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рдмрд╛рдж рд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред
private val errorHandler = CoroutineExceptionHandler { _, e -> e.printStackTrace()} private val job = SupervisorJob() private val scope = CoroutineScope(Dispatchers.Main + job + errorHandler) private var uries: HashMap<String, Uri?> = HashMap() fun startImageGenerating() = scope.launch { ... val imgMuscle = ImgMuscle() uries = withContext(Dispatchers.IO) { imgMuscle.createMuscleImages() } ... }
рдПрд░рд░рд╣реИрдВрдбрд▓рд░, рдЬреЙрдм рдФрд░ рд╕реНрдХреЛрдк рдХрд╛ рд╕реНрдЯреИрдВрдбрд░реНрдб рдмрдВрдбрд▓, рдХреЛрд░рд╛рдЙрдЯрд╛рдЗрди рдХреЗ рдЯреВрдЯрдиреЗ рдкрд░ рдПрдХ рдПрд░рд░ рд╣реИрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рд╕реНрдХрд╛рдЙрдЯ рдХреЛрд░рдЖрдЙрдЯ рд╣реЛрддрд╛ рд╣реИред
uries - HashMap, рдЬреЛ UI рдХреЗ рдмрд╛рдж рдХреЗ рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрдк рдореЗрдВ 6 рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ:
uries ["last_back"] = рдЙрд░реА?
uries ["last_front"] = рдЙрд░реА?
uries ["рд╕рдкреНрддрд╛рд╣_рдмреИрдХ"] = рдЙрд░реА?
uries ["week_front"] = рдЙрд░реА?
uries ["month_back"] = рдЙрд░реА?
uries ["month_front"] = рдЙрд░реА?
class ImgMuscle { val lruBitmap: LruCacheBitmap suspend fun createMuscleImages(): HashMap<String, Uri?> { return suspendCoroutine { continuation -> val resultUries = HashMap<String, Uri?>() ...
рд╣рдо рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВред
>start 1549400719844 >finish 1549400720440 diff=596 ms
9313 рдПрдордПрд╕ рд╕реЗ, рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдШрдЯрдХрд░ 596 рдПрдордПрд╕ рд╣реЛ рдЧрдпрд╛ред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдиреБрдХреВрд▓рди рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ - рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред