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]
数组现在效率大大提高。
我们现在说的是毫秒,而不是秒。
我正在 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]
数组现在效率大大提高。
我们现在说的是毫秒,而不是秒。