我正在将位图编码为base64。
从图像选择器中选择图像并将其设置为imageView后,我将其转换为base64。我在后台线程上执行。 它给我的感觉就像我在UI线程本身上执行操作一样。即我的用户界面冻结10-20秒,直到编码完成。
可以做些什么?所以我的UI不会冻结。
我哪里错了?
我在imageView中显示所选图像的功能
private void showSelectedImage(Uri selectedImageUri) {
blurred.setImageBitmap(null);
imglocation = selectedImageUri.toString();
Ion.with(this).load(selectedImageUri.toString()).asBitmap().setCallback(new FutureCallback<Bitmap>() {
@Override
public void onCompleted(Exception e, Bitmap result) {
if (e == null) {
blurred.setImageBitmap(result);
blurred.buildDrawingCache();
bitmap = blurred.getDrawingCache();
new Convert2base64().execute(bitmap);
}
}
});
}
这是我的AsyncTask
private class Convert2base64 extends AsyncTask<Bitmap, Integer, String> {
protected String doInBackground(Bitmap... urls) {
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
byte[] image = stream.toByteArray();
String img_str = Base64.encodeToString(image, 0);
return img_str;
}
protected void onPostExecute(String result) {
bio.setText("Base64 encoded String\n" + result);
}
}
EDIT // blured是我的imageView,这只是一个名字。我现在没有执行模糊任务。 我在Imageview中设置了由图像选择器拾取的图像,这很好,在主线程中,接下来的两行,即buildDrawingCache()和getDrawingCache()不能在后台线程中调用,只能在UI线程中运行,我在这个过程中没有任何错误,它按预期工作。但由于我在后台线程上执行任务,我希望它在后台转换图像时不会冻结UI。
答案 0 :(得分:2)
从array_walk($_SESSION['question_attempt'], function(&$string) use ($con) {
$string = mysqli_real_escape_string($con, $string);
});
方法中删除setText
,如果要检查结果,请使用postExecute
正如Marcin正确指出的那样,编码文本是大量数据。您通过调用Log.d("response",result);
在UI线程中加载的大量数据。这就是冻结UI而不是编码过程的原因。
答案 1 :(得分:0)
我不知道blurred
视图是什么,但我认为它是ImageView
,会将图像设置为模糊。模糊过程在您的UI线程上,因此导致冻结。
答案 2 :(得分:0)
您的代码看起来是正确的,您应该对其进行分析以找到需要这么长时间的代码。 IE浏览器。使用System.currentTimeMillis()
。实际上,对我来说很奇怪的是你将这个图像作为一个来自doInBackground的字符串返回,这将是一个非常长的字符串 - 然后你把它放到TextView中。也许这就需要这么久。因此,第一步是在onPostExecute中注释掉这个setText
行,看看是否有帮助。