оптимизация загрузки растровых изображений с помощью aSyncTask

StackOverflow https://stackoverflow.com/questions/3401919

Вопрос

Я пытался оптимизировать свое однопоточное приложение, которое загружает кучу фрагментов, составляющих большое растровое изображение.Приложение становилось очень медленным при загрузке новых плиток в системную память.Сейчас я пытаюсь использовать Async Tasks для этой цели.Приложение определяет, какая плитка находится в левом верхнем углу, в методе, вызываемом onDraw, создает строку, содержащую путь к растровому изображению в папке «Ресурсы», а затем перед рисованием проверяет, имеет ли растровое изображение значение NULL.Если оно равно нулю, оно загрузится в память.Моя идея заключалась в том, чтобы обработать растровое изображение в DoBackground, а в postExecute вызвать аннулирование представления для отображения асинхронно загруженного растрового изображения.Несколько вопросов:

1.) Могу ли я выполнить задачу aSync для каждого растрового изображения?(это утверждение:новый myAsyncTaskManager().execute(bitmapPath);если нет, то как лучше всего это сделать, поскольку единственное, что будет делать aSync, — это просто загружать растровые изображения в память?

2.) Можно ли установить приоритет aSyncTask, если растровые изображения загружаются слишком медленно?

3.) Есть ли лучший способ сделать это?Я уверен, что приложение замедляет загрузка растрового изображения, а не рисование на холсте.

Мой временный код aSync:

private class myAsyncTaskManager extends AsyncTask<String, Void, String> {

@Override
protected String doInBackground(String... bitmapPath) {
      Log.e("sys","i ran using aTask");
        try {

            bitmapArray[rectBeingDrawn] = BitmapFactory.decodeStream(assetManager.open(imagePathToLoad));


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       return null;
}


@Override
protected void onPostExecute(String result) {
    // execution of result of Long time consuming operation
    mCampusMap.invalidate();
}
}
Это было полезно?

Решение

Добавление нового ответа на ваш совершенно новый вопрос :)

  1. Зависит от количества растровых изображений.А у вас сколько?Вы не хотите создавать десятки тем.В конце концов, у вас только одно ядро ​​на вашем оборудовании, поэтому наличие нескольких потоков вам ничего не даст — переключение контекста просто заглушит его.Если у вас есть множество растровых изображений, возможно, вам захочется создать очередь растровых изображений и работать с ней.Для этого лучше использовать Thread и Handler.

  2. Это.Обычно я устанавливаю рабочие потоки на один уровень приоритета ниже, чем основной поток.

Другие советы

Подождите, вы называете BitmaploaderTread.run ()? Это сложно выяснить, что происходит, потому что это кодовые фрагменты без контекста (какая нить что-то работает? Какая функция?), Но вы не звоните Run () - это работа операционной системы! Чтобы начать новую тему, вы вызовите запуск () - это создаст новую поток и вызови функцию Run (). Если вы вызовите бега напрямую, вы все еще звоните в свой поток!

Кроме того - как вы делаете рукопожатие между двумя потоками? Как рабочая нить говорит главной поток, который загружен растровое изображение? Вы можете использовать обработчик для этого, или вы можете использовать Asynctask вместо потока в целом.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top