Android - правильный дизайн для реализации AsyncTask или Thread - PullRequest
2 голосов
/ 17 июля 2011

У меня есть метод getViewBitmap (), который создает растровое изображение со сторонней библиотекой (которая является проприетарной) и выглядит следующим образом:

public Bitmap getViewBitmap(int index) {
    Bitmap retBitmap = null;

    int width = 400;
    int height = 200;

    try {
        retBitmap = lib.createBitmap(width, height, index);
    } catch(BMException e) {
        e.printStacktrace();
    }

    return retBitmap;
}

Этот метод используется для создания двухстраничного растрового изображения в другомМетод:

public Bitmap getTwoPageBitmap(int firstPageIndex, intSecondPageIndex) {
    Bitmap first = getViewBitmap(firstPageIndex);
    Bitmap second = getViewBitmap(secondPageIndex);

    Bitmap retBitmap = Bitmap.create(800, 400, first.getConfig());

    Canvas helperCanvas = new Canvas(splitViewBm);
    helperCanvas.drawBitmap(leftPageBitmap, 0, 0, null);
    helperCanvas.drawBitmap(rightPageBitmap, leftPageBitmap.getWidth(), 0, null);

    return retBitmap;
}

И, наконец, в инициированном методе, у меня есть это:

public View createView() {
    MyView v = new MyView();
    if(pagePortratit) {
        v.setPageView(getViewBitmap(0));
    } else {
        // if page is landscape
        v.setPageView(getTwoPageBitmap(0, 1));
    }

    return v;
}

Теперь - я хочу сделать getViewBitmap (int) метод асинхронным.Поскольку " lib.createBitmap (int, int, int) " довольно медленный и блокирует пользовательский интерфейс, я хочу, чтобы создание растрового изображения (getViewBitmap (int)) находилось в другом потоке с возможностьюпрервать его работу.

Каков правильный дизайн для такой конструкции, чтобы действительно тяжелый метод стал асинхронным?

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Скорее всего, вы хотите создать подкласс AsyncTask (, прочитайте здесь ) и поместить свой код getBitmapView в метод doInBackground() (@Override).Когда это будет сделано, попросите метод onPostExecute() обновить View / UI.Логика для определения пейзажа или портрета будет хотеть быть вне AsyncTask, и вы просто захотите перейти к задаче (используя .execute ()), для которой всегда требуется просмотр.

Это может быть один подход.

0 голосов
/ 17 июля 2011

Я думаю, что лучшее, что вы можете сделать, это использовать AysncTask , который позволяет вам обновлять интерфейс напрямую без специальной обработки для обновления потока интерфейса пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...