0

私のアプリケーションには、1 つのボタンと 1 つの ImageView があります。ボタンをクリックすると、サーバーから写真が取得され、inimageView に表示されます。サーバーから写真を取得すると、進行状況バーが表示されます。

このアプリケーションはサーバーから写真を取得できますが、imageview には表示できません。

コード (ボタン用):

@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)
4

3 に答える 3

2

で画像ビューを更新します

 @Override
 protected void onPostExecute(Void result) {    
      //update your imageview 
 }

ワーカー スレッドで imageview を更新することはできません。

于 2012-12-11T11:59:51.307 に答える
1

ui のような変更imageViewGetPhoto.setImageBitmap(bm);onPostExecute..に移動します。

protected void onPostExecute(Void result) 
{   
    bar.dismiss();
    imageViewGetPhoto.setImageBitmap(bm);
  }
于 2012-12-11T11:53:30.900 に答える
1

この3行を

@Override
    protected void onPostExecute(Void result) 
    { 
        bar.dismiss();
        DisplayMetrics dm = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(dm);

        imageViewGetPhoto.setImageBitmap(bm); 

     }
于 2012-12-11T11:53:49.213 に答える