Оптимизация загрузки растровых изображений с помощью aSyncTask - PullRequest
0 голосов
/ 04 августа 2010

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

1.) Могу ли я выполнить свою задачу aSync для каждого растрового изображения?(это утверждение: new 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();
}
}

Ответы [ 2 ]

2 голосов
/ 04 августа 2010

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

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

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

2 голосов
/ 04 августа 2010

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

Кроме этого - как вы делаете рукопожатие между двумя нитями? Как рабочий поток сообщает основному потоку, что битмап загружен? Для этого вы можете использовать Обработчик или использовать AsyncTask вместо Thread.

...