web-dev-qa-db-ja.com

Picasso Java.lang.IllegalStateException:メインスレッドからのメソッド呼び出しは発生しません

ピカソを使用してBitmapから3つのURL画像を取得しようとしています

public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState);
  setContentView(R.layout.tab2);
  Drawable d1 = new BitmapDrawable(Picasso.with(Tab2.this).load(zestimateImg1).get());
}

FATAL EXCEPTIONこのコードで。これはAsyncTask内で実行する必要があるという事実に関係しているのではないかと思いますが、機能させることができません。それを使用することが避けられる場合、AsyncTaskを使用せずにこれを実行したいと思います。

クラッシュせずにこのコードを実行するにはどうすればよいですか?

これを行う最善の方法がAsyncTaskを使用する場合、その解決策は問題ありません。

15
Brian

メインスレッドで同期要求を行うことはできません。 AsyncThreadを使用したくない場合は、ターゲットと一緒にPicassoを使用してください。

Picasso.with(Tab2.this).load(zestimateImg1).into(new Target(...);

次のようにターゲットへの参照を保存することをお勧めします。

Target mTarget =new Target (...); 

これは、ピカソがそれらへの弱い参照を使用しており、プロセスが完了する前にガベージコレクションされる可能性があるためです。

9
user3864005

上記のどれも私のために働いた代わりにこれ

Handler uiHandler = new Handler(Looper.getMainLooper());
    uiHandler.post(new Runnable(){
        @Override
        public void run() {
            Picasso.with(Context)
                    .load(imageUrl)
                    .into(imageView);
        }
    });

それが誰かのために役立つことを願っています

9
Nikhil

参考までに:

_Picasso.with(context).load(url).into(new Target() {
    @Override
    public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
        Log.i(TAG, "The image was obtained correctly");
    }

    @Override
    public void onBitmapFailed(Drawable errorDrawable) {
        Log.e(TAG, "The image was not obtained");
    }

    @Override
    public void onPrepareLoad(Drawable placeHolderDrawable) {
        Log.(TAG, "Getting ready to get the image");
        //Here you should place a loading gif in the ImageView
        //while image is being obtained.
    }
});
_

ソース: http://square.github.io/picasso/

onPrepareLoad()は、リクエストの開始後に常に呼び出されます。 fromは、「DISK」、「MEMORY」、または「NETWORK」のいずれかで、イメージの取得元を示します。

これを試して:

Handler uiHandler = new Handler(Looper.getMainLooper());
uiHandler.post(new Runnable(){
    @Override
    public void run() {
        Picasso.with(Context)
                .load(imageUrl)
                .into(imageView);
    }
});
1

これは同じです JuanJoséMeleroGómezの回答kotlin

val imageBitmap = Picasso.get().load(post.path_image).into(object: Target {
        override fun onPrepareLoad(placeHolderDrawable: Drawable?) {
            Log.(TAG, "Getting ready to get the image");
             //Here you should place a loading gif in the ImageView
             //while image is being obtained.
        }

        override fun onBitmapFailed(e: Exception?, errorDrawable: Drawable?) {
            Log.e(TAG, "The image was not obtained");
        }

        override fun onBitmapLoaded(bitmap: Bitmap?, from: Picasso.LoadedFrom?) {
            Log.i(TAG, "The image was obtained correctly");
        }

    })
0
Jorge Casariego