Android - 实现AsyncTask或Thread的正确设计

时间:2011-07-17 16:23:19

标签: java android multithreading android-asynctask

我有一个getViewBitmap()方法,它创建一个带有第三方库(专有)的Bitmap,如下所示:

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)”非常慢并且它阻止了UI,我希望创建位图(getViewBitmap(int))在另一个线程中,打断它的工作的可能性。

这种设计的正确设计是什么,以便实际重的方法是异步的?

2 个答案:

答案 0 :(得分:1)

您可能希望继承AsyncTaskread here)并将getBitmapView代码放入doInBackground()方法(@Override)。完成后,让onPostExecute()方法更新View / UI。用于确定横向或纵向的逻辑将希望在AsyncTask之外,并且您只想将任务(使用.execute())转移到需要查看的任务。

这可能是一种方法。

答案 1 :(得分:0)

我认为您可以做的最好的事情是使用AysncTask,它允许您直接更新UI而无需对UI线程更新进行特殊处理。