Autore Topic: Problema con download delle immagini in background  (Letto 767 volte)

Offline Nemus

  • Nuovo arrivato
  • *
  • Post: 39
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Galaxy S i9000
  • Sistema operativo:
    Windows Seven x64
Problema con download delle immagini in background
« il: 22 Aprile 2011, 10:31:45 CEST »
0
Salve a tutti,

ecco innanzitutto il codice della classe che mi da problemi, ossia quella che si occupa dei download in BG:
Codice (Java): [Seleziona]
public class BatchImageDownloader extends AsyncTask<Void, Void, Void> {

    List<String> imgUrls = new ArrayList<String>();
    BaseAdapter adapter;
    HashMap<String, Drawable> imageCache;
       
    public BatchImageDownloader(BaseAdapter adapter, HashMap<String, Drawable> imageCache) {
        this.adapter = adapter;
        this.imageCache = imageCache;
    }

    public void addUrl(String url) {
        imgUrls.add(url);
        Log.i("imgDownloader", "url ADDED!");
    }

    @Override
    protected Void doInBackground(Void... params) {
        for (String url : imgUrls) {
            if (!imageCache.containsKey(url)) {
                Drawable bm = downloadImage(url);
                if (null != bm) {
                    imageCache.put(url, bm);
                    //publishProgress();
                }
            }
        }
        return null;
    }

    @Override
    protected void onProgressUpdate(Void... values) {
        adapter.notifyDataSetChanged();
    }

    @Override
    protected void onPostExecute(Void result) {
        adapter.notifyDataSetChanged();
       
    }

    public Drawable downloadImage(String url) {

        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        try {          
            HttpResponse response = httpClient.execute(request);
            InputStream stream = response.getEntity().getContent();
            Drawable drawable = Drawable.createFromStream(stream, "src");
            Log.i("imgDownloader", "image DOWNLOADED!");
            return drawable;
        } catch (ClientProtocolException e) {
            e.printStackTrace();
            return null;
        } catch (IllegalStateException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } catch (NullPointerException e){
                e.printStackTrace();
            return null;               
        }

    }

}

Ecco l'activity principale:
Codice (Java): [Seleziona]
public class EveryEyeFeedReader extends Activity {
        private static final String TAG = "Img TAG";   
        public static RssItem selItem = null;
        private SimpleAdapter newsAdapter = null;
        private ListView listView = null;
        private URL url = null;
        private ArrayList<HashMap<String, Object>> allItems=new ArrayList<HashMap<String,Object>>();
        //private ArrayList<String> allHeaders = new ArrayList<String>();
       
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
       
        HashMap<String,Drawable> downloadedIMG = new HashMap<String, Drawable>();              
                BatchImageDownloader batchDownloader = new BatchImageDownloader(newsAdapter, downloadedIMG);
       
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        try{
                url = new URL("[url=http://www.everyeye.it/news_rss.asp"]Erorre 404 - Pagina non trovata | Everyeye.it[/url]);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        //TextView tv = (TextView) findViewById(R.TV.textView1);
                                                               
                        if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
                               
                                InputStream is = conn.getInputStream();
                                DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                               
                                //using db (Document Builder) parse xml data and assign
                                //it to Element
                                DocumentBuilder db = dbf.newDocumentBuilder();
                                Document document = db.parse(is);
                                Element element = document.getDocumentElement();                               
                               
                                NodeList nodeList = element.getElementsByTagName("item");

                                if (nodeList.getLength() > 0) {
                                        for (int i = 0; i < nodeList.getLength(); i++) {
                                               
                                                //take each entry (corresponds to <item></item> tags in
                                                //xml data
                                               
                                                Element entry = (Element) nodeList.item(i);
                                               
                                                Element _titleE = (Element) entry.getElementsByTagName(
                                                                "title").item(0);
                                                Element _descriptionE = (Element) entry
                                                                .getElementsByTagName("description").item(0);
                                                Element _pubDateE = (Element) entry
                                                                .getElementsByTagName("pubDate").item(0);
                                                Element _linkE = (Element) entry.getElementsByTagName(
                                                                "link").item(0);
                                               
                                                HashMap<String,Object> itemMap=new HashMap<String, Object>();
                                               
                                                 
                                                itemMap.put("_id", i);
                                                itemMap.put("_title", _titleE.getFirstChild().getNodeValue());
                                                itemMap.put("_description", _descriptionE.getFirstChild().getNodeValue());
                                                itemMap.put("_pubDate",new Date(_pubDateE.getFirstChild().getNodeValue()));
                                                itemMap.put("_link", _linkE.getFirstChild().getNodeValue());
                                               
                                                String patternStr = " src=\"http://(.*?)\"";
                                                String _imgSrc = null;
                                                Pattern pattern = Pattern.compile(patternStr);
                                                Matcher matcher = pattern.matcher(_descriptionE.getFirstChild().getNodeValue());
                                               
                                                if(matcher.find()){
                                                        _imgSrc = matcher.group().substring(6).replace("\"", "");
                                                        Log.i(TAG, "description "+_descriptionE.getFirstChild().getNodeValue());
                                                        itemMap.put("_img", _imgSrc);
                                                }
                                                //memorizzo l'URL nell'oggetto batchDownloader
                                                batchDownloader.addUrl("[url=http://www.everyeye.it/public/immagini/19032011/r_wg5hkjhd.jpg"]Erorre 404 - Pagina non trovata | Everyeye.it[/url]);
                                                //memorizzo l'hashmap nell'arraylist
                                                allItems.add(itemMap);                                         
                                        }
                                        //finito il ciclo scarico le immagini
                                        batchDownloader.doInBackground();
                                }      
                               
                                String[] from = new String[] {"_image", "_id", "_title"};                                                        
                                int[] to = new int[]    {R.id.icon, R.id.listItemId, R.id.listItemTextView};
                               
                                //contesto, sorgente dati(ArrayList<hashmap>), quale xml prendere per il layout, quali campi prendere dall'hashmap, dove metterli nel layout
                                newsAdapter = new SimpleAdapter(this, allItems, R.layout.listitem, from, to);
                               
                                //Log.i(TAG, "numero item: "+nodeList.getLength());
                               
                                listView = (ListView) findViewById(R.id.listView);
                                listView.setAdapter(newsAdapter);
                                listView.setOnItemClickListener(new OnItemClickListener() {

                                        public void onItemClick(AdapterView<?> av, View view, int index, long arg3) {                                          
                                               
                                                //setto il titolo dell'elemento selezionato passandogli il contenuto dell'hashmap nell'array allItem corrispondente alla chive index e _title
                                                selItem.setTitle(allItems.get(index).get("_title").toString());
                                                // we call the other activity that shows a single rss item in
                                                // one page
                                                Intent intent = new Intent("com.apps.EveryEyeFeedReader.ShowItem");
                                                startActivity(intent);
                                        }
                                });
                        }
                       
                  } catch (Exception e) {
                                        e.printStackTrace();
                  }
    }

       
}

Ecco il Logcat:
Codice: [Seleziona]
04-22 10:16:18.058: INFO/imgDownloader(1814): image DOWNLOADED!
04-22 10:16:18.292: WARN/System.err(1814): java.lang.StringIndexOutOfBoundsException
04-22 10:16:18.300: WARN/System.err(1814):     at java.lang.String.substring(String.java:1651)
04-22 10:16:18.300: WARN/System.err(1814):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:366)
04-22 10:16:18.300: WARN/System.err(1814):     at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:412)
04-22 10:16:18.300: WARN/System.err(1814):     at android.graphics.drawable.Drawable.createFromPath(Drawable.java:800)
04-22 10:16:18.300: WARN/System.err(1814):     at android.widget.ImageView.resolveUri(ImageView.java:528)
04-22 10:16:18.300: WARN/System.err(1814):     at android.widget.ImageView.setImageURI(ImageView.java:305)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.SimpleAdapter.setViewImage(SimpleAdapter.java:264)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.SimpleAdapter.bindView(SimpleAdapter.java:192)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.SimpleAdapter.createViewFromResource(SimpleAdapter.java:126)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.SimpleAdapter.getView(SimpleAdapter.java:114)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.AbsListView.obtainView(AbsListView.java:1554)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.ListView.measureHeightOfChildren(ListView.java:1264)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.ListView.onMeasure(ListView.java:1175)
04-22 10:16:18.304: WARN/System.err(1814):     at android.view.View.measure(View.java:8366)
04-22 10:16:18.304: WARN/System.err(1814):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017)
04-22 10:16:18.304: WARN/System.err(1814):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:386)
04-22 10:16:18.308: WARN/System.err(1814):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
04-22 10:16:18.308: WARN/System.err(1814):     at android.view.View.measure(View.java:8366)
04-22 10:16:18.308: WARN/System.err(1814):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-22 10:16:18.308: WARN/System.err(1814):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-22 10:16:18.308: WARN/System.err(1814):     at android.view.View.measure(View.java:8366)
04-22 10:16:18.308: WARN/System.err(1814):     at android.widget.LinearLayout.measureVertical(LinearLayout.java:531)
04-22 10:16:18.308: WARN/System.err(1814):     at android.widget.LinearLayout.onMeasure(LinearLayout.java:309)
04-22 10:16:18.308: WARN/System.err(1814):     at android.view.View.measure(View.java:8366)
04-22 10:16:18.308: WARN/System.err(1814):     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138)
04-22 10:16:18.308: WARN/System.err(1814):     at android.widget.FrameLayout.onMeasure(FrameLayout.java:250)
04-22 10:16:18.308: WARN/System.err(1814):     at android.view.View.measure(View.java:8366)
04-22 10:16:18.308: WARN/System.err(1814):     at android.view.ViewRoot.performTraversals(ViewRoot.java:844)
04-22 10:16:18.308: WARN/System.err(1814):     at android.view.ViewRoot.handleMessage(ViewRoot.java:1865)
04-22 10:16:18.308: WARN/System.err(1814):     at android.os.Handler.dispatchMessage(Handler.java:99)
04-22 10:16:18.308: WARN/System.err(1814):     at android.os.Looper.loop(Looper.java:123)
04-22 10:16:18.308: WARN/System.err(1814):     at android.app.ActivityThread.main(ActivityThread.java:3687)
04-22 10:16:18.308: WARN/System.err(1814):     at java.lang.reflect.Method.invokeNative(Native Method)
04-22 10:16:18.308: WARN/System.err(1814):     at java.lang.reflect.Method.invoke(Method.java:507)
04-22 10:16:18.308: WARN/System.err(1814):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:842)
04-22 10:16:18.308: WARN/System.err(1814):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600)
04-22 10:16:18.308: WARN/System.err(1814):     at dalvik.system.NativeStart.main(Native Method)
04-22 10:16:18.308: INFO/System.out(1814): resolveUri failed on bad bitmap uri:
Da errore per ogni immagine che tento di scaricare apparte la prima.
Condigli?