Picasso java.lang.IllegalStateException: вызов метода не должен происходить из основного потока
Я пытаюсь использовать Picasso для получения трех изображений Bitmap
от 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
, то это решение в порядке.
Ответы
Ответ 1
Вы не можете выполнять синхронные запросы в основном потоке. Если вы не хотите использовать AsyncThread, просто используйте Picasso вместе с Target.
Picasso.with(Tab2.this).load(zestimateImg1).into(new Target(...);
Я рекомендую вам сохранить ссылку на вашу цель так:
Target mTarget =new Target (...);
Это потому, что Picasso использует слабые ссылки на них, и они могут быть собраны в мусор, прежде чем процесс завершится.
Ответ 2
Ничто из вышеперечисленного не помогло мне вместо этого
Handler uiHandler = new Handler(Looper.getMainLooper());
uiHandler.post(new Runnable(){
@Override
public void run() {
Picasso.with(Context)
.load(imageUrl)
.into(imageView);
}
});
Надеюсь, что это может быть полезно для кого-то.
Ответ 3
Просто для записи:
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", чтобы указать, откуда было получено изображение.
Ответ 4
попробуйте это:
Handler uiHandler = new Handler(Looper.getMainLooper());
uiHandler.post(new Runnable(){
@Override
public void run() {
Picasso.with(Context)
.load(imageUrl)
.into(imageView);
}
});