2016-06-02 6 views
0

EDIT: Ich habe den "Methodenaufruf ..." Fehler behoben. Mein Hauptproblem ist nun das Laden der Bitmap von meiner URL. Ich bin anscheinend nicht richtig damit umgehen und ich bekomme java.lang.OutOfMemoryError, wenn ich versuche, die .get() Methode von PIcasso zu verwenden.Get Bitmap von URL mit Picasso in AsyncTask

Was ist der beste Weg, dies zu tun? Ich brauche nicht einmal das ganze Bild, nur eine Mittelaufnahme, um das Hintergrundbild auf meinem Gerät zu füllen. Aber ich kann es nicht zuschneiden, ohne es zuerst zu laden, was mein Problem ist.


So malt Ich versuche, eine Bitmap aus einer bestimmten URL zu erhalten Picasso verwenden, dann Text oben drauf und es als meine Tapete Hintergrund. Ich versuche gerade dies von onPostExecute in AsyncTask zu tun. Der Fehler Ich erhalte ist:

java.lang.IllegalStateException: Method call should not happen from the main thread. 

Die Codezeile das Problem verursacht ist:

Bitmap bitmap = Picasso.with(myContext) 
       .load(url + ".jpg") 
       .fit() 
       .centerCrop() 
       .get(); 

und die ganze onPostExcute Funktion:

protected void onPostExecute(String url) { 

    ImageView imageView = (ImageView) rootView.findViewById(R.id.preview); 
    try { 
     Bitmap bitmap = Picasso.with(myContext) 
       .load(url + ".jpg") 
       .fit() 
       .centerCrop().get(); 

     Canvas canvas = new Canvas(bitmap); 
     Paint paint = new Paint(); 
     paint.setColor(Color.RED); //Text Color 
     paint.setStrokeWidth(72); //Text Size 
     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); //Text Overlapping Pattern 

     canvas.drawBitmap(bitmap, 0, 0, paint); 
     canvas.drawText("Test...", 10, 10, paint); 

     ((ImageView) rootView.findViewById(R.id.preview)).setImageBitmap(bitmap); 
     WallpaperManager wallpaperManager = WallpaperManager.getInstance(myContext); 
     //wallpaperManager.suggestDesiredDimensions(width, height); 
     wallpaperManager.setBitmap(bitmap); 

     Toast.makeText(myContext, "Wallpaper set successfully.", Toast.LENGTH_SHORT).show(); 
    } 
    catch (Exception e) { 
     android.util.Log.e(TAG, "Failed to set wallpaper", e); 
    } 
} 

Ich habe nicht einmal gewesen in der Lage, den gesamten Canvas/Farbcode zu testen, um zu sehen, ob es funktioniert. Wenn Sie dort auch etwas falsch sehen, lassen Sie es mich bitte wissen. Alle und alle Tipps werden sehr geschätzt. Vielen Dank.

+0

überprüfen, ob diese http://stackoverflow.com/a/27180835/2686502 hilft – jayeshsolanki93

+0

Picasso macht Async für dich, warum benutzt du eine AsyncTask? Und was Sie tun müssen, würde teilweise in die 'doInBackgroundMethod' gehen, falls Sie Picasso mit Ihrer asynchronen Aufgabe kombinieren möchten. Gib das geladene und modifizierte Bild zurück und setze es in 'onPostExecute'. – zapl

Antwort

0

Setzen Sie einfach @ jayeshsolanki93 und @zapl Kommentare zusammen. Sie erhalten diesen Fehler, weil Sie die Methode get() von Picasso auf dem Hauptthread aufrufen. get() ist eine synchrone Methode und daher der Fehler. Sie haben zwei Möglichkeiten:

  1. den Aufruf von get() zu doInBackground Methode Ihrer AsyncTask zu bewegen und dann auf onPostExecute alle Leinwand-Operationen zu tun.
  2. alle Vorteile von Picasso nehmen und die asynchronen Methoden verwenden, die bereits hat und so etwas tun:

    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, now you can do your canvas operation!"); 
    
        } 
    
        @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. 
        } 
    }); 
    
+0

Der Grund, warum ich Picasso in AsyncTask verwendete, ist, dass ich Netzwerkcode verwende, um eine URL an Picasso zu übergeben. Ihr habt mir geholfen, das Problem mit dem Haupt-Thread zu beheben (ich lerne immer noch), aber jetzt habe ich es mit java.lang.OutOfMemoryError zu tun, weil das eingehende Bild nicht richtig skaliert werden kann. Ich versuche, .resize (w, h) .centerCrop(). Get() zu verwenden, das nicht funktioniert. Irgendwelche Ideen? – blurbs78