Я кодирую растровое изображение в 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() не могут быть вызваны в фоновом потоке, и это только для запуска в потоке пользовательского интерфейса, Я не получаю никаких ошибок в процессе, он работает по назначению. Но так как я выполняю задачу в фоновом потоке, я ожидаю, что она не заморозит пользовательский интерфейс при преобразовании изображения в фоновом режиме.
Насколько я могу сказать, ваша строка 'нового Convert2base64(). Выполнить (растровый)' это выполняется в главном потоке, создать новую тему, и выполнить Asynctast внутри ..... При написании questio, как это, старайтесь быть как можно более конкретными, размещать целевое устройство, манифест, Logcats и все, что вы считаете, может помочь найти проблему. – Bonatti
@Bonatti AsyncTask выполняет в новом потоке, разве это не так? – Kevin
Если вы посмотрите пример Android http://developer.android.com/reference/android/os/AsyncTask.html. Ваш код кажется правильным, может блокировать ваш основной поток где-то еще –