Android 上的多线程问题

Multithreading issues on Android

我正在 Android 上进行多线程图像处理,我遇到了一个我无法澄清的问题。

在某些手机上,即使是旧手机,我的计时也不错,但在较新的手机上,我无法接受。

一些代码:

public class ShiftEffectManager implements ShiftRunnable.OnShiftRunCompleteListener {

    ...

    public ShiftEffectManager(OnEffectAppliedListener listener, Bitmap source) {
        mService = Executors.newFixedThreadPool(MAX_THREADS);

        ...
    }

    public void execute() {

        ...

        for (int i = 0; i < MAX_THREADS; i++) {
            mService.submit(new ShiftRunnable(this, getFraction(mSource, start, step), start, offsets));
        }
    }

    private Bitmap getFraction(Bitmap source, int start, int step) {
        return Bitmap.createBitmap(source, 0, start, source.getWidth(), step);
    }

    @UiThread
    private void assembleBitmap() {
        ...
        ((Activity) mListener).runOnUiThread(new Runnable() {
            @Override
            public void run() {
                mListener.onEffectApplied(output);
            }
        });
    }

    @Override
    public void onShiftRunComplete(ShiftFractionPayload payload) {
        mPayloads.add(payload);
        mTaskCount++;

        if (mTaskCount == MAX_THREADS) {
            assembleBitmap();
        }
    }
}

ShiftRunnable 正在解析 1920 * (1080 / MAX_THREADS) 并在给定偏移量上移动红色和蓝色通道。因此,每次通过多次 getPixels() 和 setPixels()。

这是一个与设备相关的问题,一个 OS 问题(因为两个 'faulty' 设备都在 6.x 中)?

感谢任何帮助,谢谢。

毕竟不是多线程问题...

每次传递多次调用 getPixel(x, y) 和 setPixel(x, y) 会减慢执行速度。 但是,由于未知原因,post Marshmallow 设备/模拟器上的情况更糟。

使用 getPixels() / setPixels() from/in int[width * height] 数组现在效率大大提高。 我们现在说的是毫秒,而不是秒。