Autore Topic: Caricamento Immagine con Volley restituisce "decoder->decode returned false"  (Letto 356 volte)

Offline ArchangelInHell

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Sistema operativo:
    Android 4.3
Ciao a tutti ragazzi!Sono nuovo sia di questo forum sia di programmazione Android. Ho un problema sviluppando un'app e cercherò di spiegarmi più brevemente possibile.
Sto sviluppando una app insieme ad un amico. Lo scopo iniziale è visualizzare in una ListView un elenco di prodotti di un negozio mettendo ovviamente una piccola immagine con dettagli come nome,prezzo,etc.
Ho sviluppato l'app utilizzando la libreria Volley e va quasi tutto bene, il "quasi" è perchè per alcune immagini mi dà l'errore "D/skia﹕ --- decoder->decode returned false". Per provare se il problema era dovuto a qualche errore usando ListView o altri elementi ho creato totalmente un'altra app,la quale utilizza sempre Volley(e ho chiamato l'app VolleyButton) e che semplicemente inserendo in un EditText un indirizzo web di una immagine dovrebbe visualizzarla sotto la stessa EditText. Il problema rimane perchè con tutte le immagini funziona tranne che con una. Facendo un confronto tra le caratteristiche delle immagini ho notato che l'unica differenza è che quella immagine ha Profondità in bit di 32 bit,mentre tutte quelle che carica tranquillamente hanno profondità 24 bit,ma non son sicuro che il problema sia quello. Ho cercato un po' su Internet(sia su forum italiani che inglesi) e ho notato che molti hanno avuto lo stesso problema ma tutte le possibili soluzioni le ho provate ma non hanno funzionato,non so se perché non le ho adattate nel modo giusto nel mio caso. Più in dettaglio il Log mi restituisce questo:


10-28 13:33:43.424    1807-3123/com.example.volleybutton I/dalvikvm-heap﹕ Grow heap (frag case) to 5.751MB for 719884-byte allocation
10-28 13:33:43.433    1807-1817/com.example.volleybutton D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 15% free 5694K/6692K, paused 9ms, total 9ms
10-28 13:33:43.433    1807-3123/com.example.volleybutton D/Volley﹕ [80] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://www.wateasybuy.it/Documenti/Prodotti/product_211/test%202_54.jpg 0xdd39e268 LOW 1> [lifetime=4620], [size=719872], [rc=200], [retryCount=0]
10-28 13:33:43.433    1807-3123/com.example.volleybutton D/skia﹕ --- decoder->decode returned false
10-28 13:33:43.654    1807-3124/com.example.volleybutton D/dalvikvm﹕ GC_FOR_ALLOC freed 2272K, 49% free 3463K/6692K, paused 3ms, total 3ms
10-28 13:33:43.654    1807-3124/com.example.volleybutton I/dalvikvm-heap﹕ Grow heap (frag case) to 4.259MB for 719884-byte allocation
10-28 13:33:43.654    1807-3124/com.example.volleybutton D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 38% free 4166K/6692K, paused 2ms, total 2ms
10-28 13:33:45.403    1807-3124/com.example.volleybutton D/dalvikvm﹕ GC_FOR_ALLOC freed 720K, 49% free 3464K/6692K, paused 0ms, total 4ms
10-28 13:33:45.403    1807-3124/com.example.volleybutton I/dalvikvm-heap﹕ Grow heap (frag case) to 4.260MB for 719884-byte allocation
10-28 13:33:45.413    1807-1817/com.example.volleybutton D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 38% free 4167K/6692K, paused 10ms, total 10ms
10-28 13:33:47.623    1807-3124/com.example.volleybutton D/dalvikvm﹕ GC_FOR_ALLOC freed 8K, 38% free 4167K/6692K, paused 2ms, total 2ms
10-28 13:33:47.623    1807-3124/com.example.volleybutton I/dalvikvm-heap﹕ Grow heap (frag case) to 4.947MB for 719884-byte allocation
10-28 13:33:47.633    1807-1817/com.example.volleybutton D/dalvikvm﹕ GC_FOR_ALLOC freed <1K, 28% free 4870K/6692K, paused 3ms, total 3ms
10-28 13:33:47.633    1807-3124/com.example.volleybutton D/Volley﹕ [81] BasicNetwork.logSlowRequests: HTTP response for request=<[ ] http://www.wateasybuy.it/Documenti/Prodotti/product_211/test%202_54.jpg 0xdd39e268 LOW 2> [lifetime=4198], [size=719872], [rc=200], [retryCount=1]
10-28 13:33:47.633    1807-3124/com.example.volleybutton D/skia﹕ --- decoder->decode returned false


Questa app per solo il caricamente di una immagine da Web ha layout di questo tipo:
Codice (XML): [Seleziona]
<LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:orientation="vertical"
   android:layout_height="match_parent"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   android:paddingBottom="@dimen/activity_vertical_margin"
   tools:context=".MainActivity">


    <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">

        <EditText
           android:id="@+id/editTextUrl"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_weight="1" />

        <Button
           android:id="@+id/buttonLoad"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="Show Image" />

    </LinearLayout>

    <com.android.volley.toolbox.NetworkImageView
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:id="@+id/imageView"
       />

</LinearLayout>

Il file Java principale(MainActivity.java) con codice:
Codice (Java): [Seleziona]
public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText editTextUrl;
    private Button buttonLoad;
    private NetworkImageView imageView;
    private ImageLoader imageLoader;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        editTextUrl = (EditText) findViewById(R.id.editTextUrl);
        buttonLoad = (Button) findViewById(R.id.buttonLoad);
        imageView = (NetworkImageView) findViewById(R.id.imageView);

        buttonLoad.setOnClickListener(this);
    }

    private void loadImage(){
        String url = editTextUrl.getText().toString().trim();
        if(url.equals("")){
            Toast.makeText(this,"Please enter a URL",Toast.LENGTH_LONG).show();
            return;
        }

        imageLoader = CustomVolleyRequest.getInstance(this.getApplicationContext())
                .getImageLoader();
        imageLoader.get(url, ImageLoader.getImageListener(imageView,
                R.drawable.image, android.R.drawable
                        .ic_dialog_alert));
        imageView.setImageUrl(url, imageLoader);
    }

    @Override
    public void onClick(View v) {
        if(v == buttonLoad){
            loadImage();
        }
    }

Infine il CustomVolleyRequest.java per la richiesta Volley ha codice:
Codice (Java): [Seleziona]
public class CustomVolleyRequest {

    private static CustomVolleyRequest customVolleyRequest;
    private static Context context;
    private RequestQueue requestQueue;
    private ImageLoader imageLoader;

    private CustomVolleyRequest(Context context) {
        this.context = context;
        this.requestQueue = getRequestQueue();

        imageLoader = new ImageLoader(requestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });
    }

    public static synchronized CustomVolleyRequest getInstance(Context context) {
        if (customVolleyRequest == null) {
            customVolleyRequest = new CustomVolleyRequest(context);
        }
        return customVolleyRequest;
    }

    public RequestQueue getRequestQueue() {
        if (requestQueue == null) {
            Cache cache = new DiskBasedCache(context.getCacheDir(), 10 * 1024 * 1024);
            Network network = new BasicNetwork(new HurlStack());
            requestQueue = new RequestQueue(cache, network);
            requestQueue.start();
        }
        return requestQueue;
    }

    public ImageLoader getImageLoader() {
        return imageLoader;
    }

}

Ripeto,funziona perfettamente con il 90% delle immagini,solo alcune mi danno quel problema che vedete nel Log. Sono quasi sicuro che sia qualche errore scemo dovuto al fatto che sono ancora alle prime armi, se sapete quale sia il problema e mi sapete dare anche una possibile soluzione, in base al codice che vi ho postato, ve ne sarei grato.
Speriando di ricevere un aiuto quanto prima, vi ringrazio anticipatamente!