12

Sto tentando di usare Picasso per ottenere tre Bitmap immagini da una URLPicasso java.lang.IllegalStateException: chiamata metodo non dovrebbe accadere dal thread principale

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

sto ottenendo FATAL EXCEPTION con questo codice. Sospetto che abbia a che fare con il fatto che questo dovrebbe essere fatto entro AsyncTask, ma non riesco a farlo funzionare. Se l'uso è evitabile, vorrei farlo senza usare AsyncTask.

Come posso eseguire questo codice senza arrestarsi?

Se il modo migliore per farlo è con AsyncTask, la soluzione è ok.

+0

rivedere la documentazione di Picasso e vedere dove lo chiamano 'get()' e come è previsto da essere usato. – zapl

+1

@zapl Trovo questo: 'android.graphics.Bitmap get() soddisfa sinceramente questa richiesta. Non capisco molto le discussioni:/ –

+0

Accetterò anche la soluzione' AsyncTask', anche se devo caricare tre immagini. Ho solo bisogno di questo per lavorare lol –

risposta

7

Non è possibile effettuare richieste sincrone nel thread principale. Se non vuoi usare un AsyncThread, usa Picasso solo insieme a una Target.

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

vi consiglio di salvare un riferimento al vostro obiettivo in questo modo:

Target mTarget =new Target (...); 

Questo perché Picasso utilizza riferimenti deboli a loro ed essi potrebbe essere garbage collection prima che il processo è finito.

+1

Puoi espandere su questo con un esempio? –

2

Solo per la cronaca:

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 to 
     //while image is being obtained. 
    } 
}); 

Fonte: http://square.github.io/picasso/

onPrepareLoad() si chiama sempre dopo aver avviato la richiesta. from può essere "DISK", "MEMORY" o "NETWORK" per indicare da dove è stata ottenuta l'immagine.

0

Nessuno di sopra ha lavorato per me invece questo

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

spero che può essere utile per qualcuno

Problemi correlati