Android: ошибка AsyncTask при отображении индикатора выполнения
В моем приложении есть одна кнопка и один ImageView. После нажатия на кнопку он получает фотографию с сервера и отображает ее на inmageView. Во время получения фотографии с сервера отображается индикатор выполнения.
Это приложение может получать фотографии с сервера, но не может отображаться в режиме просмотра изображений.
код (для кнопки):
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.buttonFetchPhoto:
new BackgroundTask().execute("Main");
break;
}
}
код (для индикатора выполнения)
class BackgroundTask extends AsyncTask<String , Integer, Void>
{
@Override
protected void onPreExecute()
{
bar = new ProgressDialog(activity.this);
bar.setMessage("Processing..");
bar.setIndeterminate(true);
bar.show();
}
@Override
protected Void doInBackground(String... params)
{
// Code to get Photo Byte Array from server
Bitmap bm = BitmapFactory.decodeByteArray(photoByteArray, 0,photoByteArray.length);
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
imageViewGetPhoto.setImageBitmap(bm); //imageViewGetPhoto is define in activity class
}
return null;
}
@Override
protected void onPostExecute(Void result)
{
bar.dismiss();
}
}
Я получаю сообщение об ошибке из-за "imageViewGetPhoto.setImageBitmap (bm)"
Я думаю, это потому, что "imageViewGetPhoto" определен в классе макета, который является основным потоком, и этот поток не может синхронизироваться с основным потоком.
Как я получаю данные в основной поток, который извлекается другим потоком.
Или как я получаю доступ к объектам в другой поток, который определен в основном макете.
Ошибка:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:200)
at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
at java.lang.Thread.run(Thread.java:1019)
Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
at android.view.ViewRoot.checkThread(ViewRoot.java:3020)
at android.view.ViewRoot.requestLayout(ViewRoot.java:634)
at android.view.View.requestLayout(View.java:8267)
at android.view.View.requestLayout(View.java:8267)
at android.view.View.requestLayout(View.java:8267)
at android.view.View.requestLayout(View.java:8267)
at android.widget.ScrollView.requestLayout(ScrollView.java:1580)
at android.view.View.requestLayout(View.java:8267)
at android.widget.TableLayout.requestLayout(TableLayout.java:226)
at android.view.View.requestLayout(View.java:8267)
at android.view.View.requestLayout(View.java:8267)
at android.widget.TableLayout.requestLayout(TableLayout.java:226)
at android.view.View.requestLayout(View.java:8267)
at android.view.View.requestLayout(View.java:8267)
at android.widget.ImageView.setImageDrawable(ImageView.java:322)
at android.widget.ImageView.setImageBitmap(ImageView.java:336)
at com.pixel.potholelocator.PohholeLocatorActivity$BackgroundTask.doInBackground(PohholeLocatorActivity.java:295)
at com.pixel.potholelocator.PohholeLocatorActivity$BackgroundTask.doInBackground(PohholeLocatorActivity.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:185)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
3 ответа
Запишите эти 3 строки в
@Override
protected void onPostExecute(Void result)
{
bar.dismiss();
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
imageViewGetPhoto.setImageBitmap(bm);
}
Обновите вид изображения в
@Override
protected void onPostExecute(Void result) {
//update your imageview
}
мы не можем обновить изображение в рабочем потоке.
Moveany модификация пользовательского интерфейса, как imageViewGetPhoto.setImageBitmap(bm);
в onPostExecute
..
protected void onPostExecute(Void result)
{
bar.dismiss();
imageViewGetPhoto.setImageBitmap(bm);
}