Я пытаюсь загрузить растровые изображения с помощью AsyncTask, чтобы загрузить их вне потока пользовательского интерфейса, поскольку это было слишком медленно. К сожалению, у меня возникают проблемы при запуске приложения.
AsyncTask - это класс, объявленный внутри класса «BitmapBank», используемый для обработки различных растровых изображений приложения. Я сделал это таким образом, чтобы избежать того, что вы не можете вернуть что-то из Asynctask.
Вот мой код:
public Bitmap loadBitmap(Drawable drawable){
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
Canvas canvas = new Canvas(bitmap);
drawable.draw(canvas);
return bitmap;
}
private Bitmap scaleImage(Bitmap bitmap, int ratio){
float widthHeightRatio = (float)(bitmap.getHeight())/(float)(bitmap.getWidth());
int scaleHeight = (int)(widthHeightRatio * AppConstants.SCREEN_WIDTH/ratio);
return Bitmap.createScaledBitmap(bitmap, AppConstants.SCREEN_WIDTH/ratio, scaleHeight, false);
}
private class BitmapTask extends AsyncTask<Drawable, Void, Void> {
public BitmapTask(){
super();
}
@Override
protected Void doInBackground(Drawable... drawables) {
rocket = prepareBitmap(drawables[0]);
astronaut = prepareBitmap(drawables[1]);
bloc = prepareBitmap(drawables[2]);
background = prepareBitmap(drawables[3]);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
rocket = scaleImage(rocket, 10);
astronaut = scaleImage(astronaut, 20);
bloc = scaleImage(bloc, AppConstants.NB_BLOCS);
background = scaleImage(background, 1);
}
}
А вот logcat:
Caused by: java.lang.OutOfMemoryError: Failed to allocate a 121701132 byte allocation with 16777216 free bytes and 86MB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:975)
at android.graphics.Bitmap.createBitmap(Bitmap.java:946)
at android.graphics.Bitmap.createBitmap(Bitmap.java:913)
at com.example.myapplication.BitmapBank.prepareBitmap(BitmapBank.java:93)
at com.example.myapplication.BitmapBank$BitmapTask.doInBackground(BitmapBank.java:117)
at com.example.myapplication.BitmapBank$BitmapTask.doInBackground(BitmapBank.java:106)
at android.os.AsyncTask$2.call(AsyncTask.java:295)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at java.lang.Thread.run(Thread.java:818)
Спасибо, если вы можете посмотреть!