我正在开发简单的应用程序,它应该对用户进行一些图像处理和显示进度。因为我希望用户看到整个过程,所以在过程完成后无法将位图设置为imageView,或者在UI线程中完成工作。
我最终得到了以下解决方案:
AsyncTask
)以下是简化的源代码:
public class ImageProcessingTask extends AsyncTask<Params, Void, Bitmap>
{
private Listener listener = null;
public ImageProcessingTask(Listener listener)
{
this.listener = listener;
}
@Override
protected Bitmap doInBackground(Params... params)
{
// Do work, call setPixel in cycle without Thread.sleep() is enough
ImageProcessing.processImage(params[0]);
}
@Override
protected void onPostExecute(Bitmap bitmap)
{
if(listener != null)
{
listener.onImageProcessingTaskPostExecute(bitmap);
}
}
}
一切都很好,除了偶尔大约一半的图像(随机),过程停止,我得到这个
E/OpenGLRenderer﹕ Cannot generate texture from bitmap
在这个thread中,我发现它与硬件加速有关,所以我将其关闭
imageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
问题从控制台中消失了,但我实现的每一个都是位图在完全相同的位置上从ImageView中消失,而不是冻结。
我在互联网上找到了几个讨论,但我还没有找到解决这个问题的有用方法。我尝试使用synchronized
语句和java.util.concurrent.Semaphore
同步访问位图,但没有成功。
最后一个有趣的事实我注意到 - 我有简单的颜色检测算法,计算图片上各个颜色的数量。如果我在图像处理功能之后运行它,它会返回不同的值,就好像位图根本没有改变颜色(物理上,所以它可能不仅仅是OpenGL问题)。
我使用的方法列表: