为什么AsyncTask会冻结我的用户界面?

时间:2015-12-04 10:08:55

标签: android bitmap android-asynctask

我正在将位图编码为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。

3 个答案:

答案 0 :(得分:2)

array_walk($_SESSION['question_attempt'], function(&$string) use ($con) { $string = mysqli_real_escape_string($con, $string); }); 方法中删除setText,如果要检查结果,请使用postExecute

检入logcat

正如Marcin正确指出的那样,编码文本是大量数据。您通过调用Log.d("response",result);在UI线程中加载的大量数据。这就是冻结UI而不是编码过程的原因。

答案 1 :(得分:0)

我不知道blurred视图是什么,但我认为它是ImageView,会将图像设置为模糊。模糊过程在您的UI线程上,因此导致冻结。

答案 2 :(得分:0)

您的代码看起来是正确的,您应该对其进行分析以找到需要这么长时间的代码。 IE浏览器。使用System.currentTimeMillis()。实际上,对我来说很奇怪的是你将这个图像作为一个来自doInBackground的字符串返回,这将是一个非常长的字符串 - 然后你把它放到TextView中。也许这就需要这么久。因此,第一步是在onPostExecute中注释掉这个setText行,看看是否有帮助。