1

私の質問はこのスレッドに関するもの です-アンドロイドでイメージビューを更新する方法

私もソケットを介して画像を取得し、デコードし、画像ビューに設定しようとしています。別の画像が送信され、その後 imageview が再び更新される場合に備えて、ソケットは開いたままにする必要があります。

他のスレッドで彼らがメインスレッドでそれをしないように応答したとき、私はその部分を手に入れませんでした。

メインのアクティビティから、「while (true)」で「立ち往生」する新しいスレッドを開く必要があります。これにより、今後の画像をリッスンし続けることができます。完全な画像が送信されたときは、imageview を更新する必要があります。しかし、イメージビューはメインスレッドにあるため(メインスレッドはUIスレッドと同じですか?)、私にとっては少し問題になり始めています...

誰?

// 追加 - これは私が持っていた asyncTask です -

public class AsyncTask extends AsyncTask<Void, Void, Void> {
 private DataInputStream dataInputStream = null;
 private ImageView iv = null;

 public RobotMapAsyncTask(DataInputStream dataStream, ImageView imageView) {
     dataInputStream = dataStream;
     iv = imageView;
 }

@Override
protected Void doInBackground(Void... params) {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    byte[] byteChunk = new byte[1024];
    Bitmap bitmap = null;
    int c;

    if (dataInputStream != null) {
        while (true) {
            try {
                byteChunk = new byte[1024];
                while ((c = dataInputStream.read(byteChunk)) != -1){
                    buffer.write(byteChunk, 0, c);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

            bitmap = BitmapFactory.decodeByteArray(byteChunk, 0, byteChunk.length);

            if (bitmap != null) {
                //runOnUiThread(new Runnable() {
                    //public void run() {
                        //iv.setImageBitmap(bitmap);
                    //}
               // }); 
            }
        }
    }

    return null;
}

しかし、これはアクティビティではないため、明らかにrunOnUiThreadを呼び出すことはできません...

4

3 に答える 3

1

新しい画像を取得したら、次のように呼び出します。

runOnUiThread(new Runnable() {
        public void run() {
            imView.setBackgroundResource(yourResource);
        }
    });   

コードに合わせて明らかな変更を加えるだけです

于 2012-06-06T21:23:08.760 に答える
0

Activity.runOnUIThread(Runnable) またはによって起動されたRunnableでImageViewの画像を変更しますHandler.post(Runnable)

于 2012-06-06T21:18:14.513 に答える
0

これは、次の 2 つの方法で行うことができます。

a)1つの方法は、ハンドラーを使用してワーカースレッドを呼び出し、画像のフェッチとデコードを行うメインスレッドから実行可能にすることです。デコードされた画像を取得したら、ワーカー スレッドから imageview を設定するだけです

b) または、Android の非同期タスク機能を使用して画像を取得し、メイン スレッドで画像ビューを更新することもできます

于 2012-06-06T21:24:31.933 に答える