22

別のスレッドでインターネットから画像をダウンロードし、
その画像オブジェクトをハンドラー メッセージで UI スレッドに送信する必要があります。

私はすでにこれを持っています:

...
Message msg = Message.obtain();

Bundle b = new Bundle();
b.putParcelable("MyObject", (Parcelable) object);
msg.setData(b);

handler.sendMessage(msg);

そして、このメッセージを受け取ったら、オブジェクトを抽出したいと思います:

...
public void handleMessage(Message msg) {
    super.handleMessage(msg);

    MyObject objectRcvd = (MyObject) msg.getData().getParcelable("IpTile");
    addToCache(ipTile);
    mapView.invalidate();
}

しかし、これは私に与えています:

...java.lang.ClassCastException...

誰でも助けることができますか?


ところで、これはオブジェクトを UI スレッドに渡す 最も効率的な方法ですか?

皆さん、ありがとうございました!

4

4 に答える 4

69

私はパーティーに遅れていることは知っていますが、単一のプロセス内でサービスを使用している場合は、より簡単な方法があります。この行を使用して 、任意の任意のファイルを添付できObjectます。Message

msg.obj = new CustomObject() // or whatever object you like

これは私の現在のプロジェクトでうまく機能しています。
ああ、AsyncTaskオブジェクトの使用をやめようとしています。オブジェクトはコードの結合度を上げすぎると思うからです。

于 2011-06-29T01:13:34.320 に答える
7

最初:例外はどこで発生しますか?インスタンスをバンドルに入れるとき、またはそれを取得するとき?

私はあなたが物事を混同していると信じています。バンドルを作成するときは、

b.putParcelable("MyObject", (Parcelable) object);

objetつまり、インスタンス " " をキー " " に割り当てていますMyObject。ただし、インスタンスを取得するときは、次のように記述します。

MyObject objectRcvd = (MyObject) msg.getData().getParcelable("IpTile");

ここでは、キー " " からインスタンスを取得していますIpTile。注意してください"IpTile" != "MyObject"。以下を使用してオブジェクトを取得してみてください。

MyObject objectRcvd = (MyObject) msg.getData().getParcelable("MyObject");

またはその逆の場合は、インスタンスをバンドルに入れるコードを次のように置き換えてみてください。

b.putParcelable("IpTile", (Parcelable) object);

他にも確認すべき点がいくつかあります。

  • クラスMyObjectは実装されていParcelableますか? (そうだと思います、そうでなければコンパイルできません)
  • 変数objectには を実装するインスタンスが含まれていますParcelableか?
于 2010-06-09T11:25:48.343 に答える
4

この種の操作には AsyncTask を使用します。これにより、進行状況の更新やダウンロードの完了などのために、UI スレッドにフックすることができます。以下の例は、その方法を示しています。

class GetImageTask extends AsyncTask<String, int[], Bitmap> {

  @Override
  protected Bitmap doInBackground(String... params) {
    Bitmap bitmap = null;

    // Anything done here is in a seperate thread to the UI thread 
    // Do you download from here

    // If you want to update the progress you can call
    publishProgress(int progress); // This passes to the onProgressUpdate method

    return bitmap; // This passes the bitmap to the onPostExecute method
  }

  @Override
  protected void onProgressUpdate(Integer... progress) {
    // This is on your UI thread, useful if you have a progressbar in your view
  }

  @Override
  protected void onPostExecute(Bitmap bitmapResult) {
    super.onPostExecute(bitmapResult);
    // This is back on your UI thread - Add your image to your view
    myImageView.setImageBitmap(bitmapResult);
  }
}

それが役立つことを願っています

于 2010-06-09T09:44:43.370 に答える