2013-11-17 6 views
1

Я даю Picasso попробовать немного упростить управление памятью с помощью изображений. Я только пытался реализовать его в своем фрагменте, но я не могу заставить его работать.Android Picasso: Не загружается в фрагмент

mainLayout.setBackground(new BitmapDrawable(getResources(), Picasso.with(mainLayout.getContext()).load(R.drawable.background2).get())); 

Где mainLayout - LinearLayout. Я также попытался это:

Picasso.with(getActivity().getApplicationContext()).load(R.drawable.background2).into(imageView1); 

Я попытался Picasso.with (это) ... но это не работает.

я получаю исключение:

java.lang.IllegalStateException: Method call should not happen from the main thread. 
at com.squareup.picasso.Utils.checkNotMain(Utils.java:71) 
at com.squareup.picasso.RequestCreator.get(RequestCreator.java:206) 
at ... 

где я его назвал.

Кто-нибудь испытывает это или знает, как правильно использовать его с фрагментами?

ответ

9

Сообщение об исключении говорит об этом довольно ясно. Сообщение .get() не является асинхронным, поэтому будет выполнять работу (сеть, читать файл, ... что угодно) в основном потоке, который следует избегать, когда это возможно.

Ваш код для установки изображения на изображениеПросмотр кажется правильным для меня.

Я думаю, что также можно сделать то же самое с mainLayout (Picasso затем автоматически установит обратимое/растровое изображение на задний план). Если я ошибаюсь, посмотрите на Target.class, который поставляется с Picasso. Вы можете загрузить изображение в цель, которая должна обеспечивать обработчики успеха и ошибки. Внутри обработчика успеха вы получите растровое изображение после его загрузки и можете установить его на свою базу.

Есть несколько решений, которые могут работать в вашем случае.

[EDIT]

При использовании метода Get(), предоставленный Пикассо загрузка будет происходить в потоке вы сейчас работаете, о котором ясно сказано в источниках: https://github.com/square/picasso/blob/master/picasso/src/main/java/com/squareup/picasso/RequestCreator.java

/** Синхронно выполнять этот запрос. Не следует вызывать из основного потока. */

общественного Bitmap прибудете() бросает IOException {[...]}

В вашем случае я бы использовать Target интерфейс, который обеспечивает функции обратного вызова, когда изображение загружается.

Picasso.with(getActivity()).load(R.drawable.background2).into(new Target(){ 

    @Override 
    public void onBitmapLoaded(Bitmap bitmap, LoadedFrom from) { 
    mainLayout.setBackground(new BitmapDrawable(context.getResources(), bitmap)); 
    } 

    @Override 
    public void onBitmapFailed(final Drawable errorDrawable) { 
     Log.d("TAG", "FAILED"); 
    } 

    @Override 
    public void onPrepareLoad(final Drawable placeHolderDrawable) { 
     Log.d("TAG", "Prepare Load"); 
    }  
}); 

Как вы используете внутренний ресурс здесь, почему бы вам просто не сделать следующее?

mainLayout.setBackgroundResource(R.drawable.background2); 

Надеюсь, это поможет.

С уважением

+0

Так вы говорите, я должен сделать загрузку их в AsyncTask? –

+0

Нет, я бы не рекомендовал этого, он просто добавляет сложности, когда это не нужно. Я отредактирую свой ответ и даю несколько рабочих примеров. –

+0

Хорошо, это здорово, имеет больше смысла. Что касается mainLayout.setBackgroundResource(), это хороший способ сделать это с точки зрения потребления памяти? –

0

Попробуйте это

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     holder = new ViewHolder(); 
     v = vi.inflate(Resource, null); 
     holder.imageview = (ImageView) v.findViewById(R.id.news_img); 
     holder.tvName = (TextView) v.findViewById(R.id.news_title); 
     holder.tvDate = (TextView) v.findViewById(R.id.news_time); 
     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) v.getTag(); 
    } 

    holder = (ViewHolder)v.getTag(); 
    Picasso.with(context).load(postList.get(position).getThumbnail()).into(holder.imageview); 
    holder.tvName.setText(postList.get(position).getTitle()); 
    holder.tvDate.setText(postList.get(position).getDate()); 

    return v; 

} 
Смежные вопросы