2015-12-04 4 views
-2

Я кодирую растровое изображение в base64.Почему AsyncTask замораживает мой интерфейс?

после того, как я выбрать изображение из палитры изображения и установите его в ImageView, я преобразовать его в base64. которые я выполняю на фоновом потоке. Это дает мне то же самое ощущение, что я выполняю операцию с самой нитью UI. то есть мой пользовательский интерфейс зависает в течение 10-20 секунд, пока кодирование не будет завершено.

что можно сделать? так что мой пользовательский интерфейс не зависает.

где я иду не так?

Моя функция для отображения выбранного изображения в 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 // размыли мой ImageView который просто имя RIghtNOw. Я не выполняю размытие задачи прямо сейчас. я установил изображения, снятые с помощью подборщика изображений в ImageView, то отлично, в основном потоке, следующие две строки, т.е. buildDrawingCache() и getDrawingCache() не могут быть вызваны в фоновом потоке, и это только для запуска в потоке пользовательского интерфейса, Я не получаю никаких ошибок в процессе, он работает по назначению. Но так как я выполняю задачу в фоновом потоке, я ожидаю, что она не заморозит пользовательский интерфейс при преобразовании изображения в фоновом режиме.

+0

Насколько я могу сказать, ваша строка 'нового Convert2base64(). Выполнить (растровый)' это выполняется в главном потоке, создать новую тему, и выполнить Asynctast внутри ..... При написании questio, как это, старайтесь быть как можно более конкретными, размещать целевое устройство, манифест, Logcats и все, что вы считаете, может помочь найти проблему. – Bonatti

+1

@Bonatti AsyncTask выполняет в новом потоке, разве это не так? – Kevin

+0

Если вы посмотрите пример Android http://developer.android.com/reference/android/os/AsyncTask.html. Ваш код кажется правильным, может блокировать ваш основной поток где-то еще –

ответ

2

Удалить setText из postExecute метод, если вы проверяете результат, то скорее проверить в LogCat с помощью Log.d("response",result);

Кодированного текст большого объема данных, поскольку Марцин правильно указал. Эта большая сумма, которую вы загружаете обратно в поток пользовательского интерфейса, вызывая setText. Это то, что замораживает пользовательский интерфейс, а не процесс кодирования.

0

Я не знаю, что такое вид blurred, но я предполагаю, что это ImageView, что делает изображение настроенным на него как размытое. Этот процесс размытия находится в вашем потоке пользовательского интерфейса и, таким образом, вызывает замораживание.

+0

да, размытый - это просто изображение. я пропустил, чтобы упомянуть об этом, я обновил свой вопрос, будучи немного более конкретным – Veer3383

0

Ваш код выглядит правильно, вы должны профиль его, чтобы найти то, что занимает так много времени. То есть. используя System.currentTimeMillis(). Собственно, мне кажется, что вы возвращаете это изображение как строку из doInBackground, это будет очень длинная строка, а затем вы помещаете ее в TextView. Возможно, это так долго. Итак, первый шаг - прокомментировать эту строку setText в onPostExecute и посмотреть, поможет ли это.