ayansinha
ayansinha

Reputation: 85

Android Not responding in loading images from Url

I am trying to parse the xml file and trying to load images and textviews and display it in a list view but whenever i try to load images in getView method in force closes the application even if try to scroll fast it also does the same. Iam tired of doing it in thread and asynctask for 5hours.please help if someone can solve it. Here are my two class files.

class NewsRowAdapter

public class NewsRowAdapter extends ArrayAdapter<Item> 
{
    LoadingImage loadingImage;

    Bitmap bitmap = null;

    private Activity activity;

    private List<Item> items;

    private Item objBean;

    private int row;

    public NewsRowAdapter(Activity act, int resource, List<Item> arrayList) 
    {

        super(act, resource, arrayList);

        this.activity = act;

        this.row = resource;

        this.items = arrayList;


    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        View view = convertView;

        final ViewHolder holder;

        if (view == null) 
        {

            LayoutInflater inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            view = inflater.inflate(row, null);

            holder = new ViewHolder();

            view.setTag(holder);

        } else 
        {
            holder = (ViewHolder) view.getTag();
        }

        if ((items == null) || ((position + 1) > items.size()))

            return view;

        objBean = items.get(position);

        holder.tvTitle = (TextView) view.findViewById(R.id.tvtitle);

        holder.tvDesc = (TextView) view.findViewById(R.id.tvdesc);

        holder.tvDate = (TextView) view.findViewById(R.id.tvdate);

        holder.imgView = (ImageView) view.findViewById(R.id.image);

        holder.pbar = (ProgressBar) view.findViewById(R.id.pbar);

        if (holder.tvTitle != null && null != objBean.getTitle() && objBean.getTitle().trim().length() > 0) 
        {
            holder.tvTitle.setText(Html.fromHtml(objBean.getTitle()));
        }
        if (holder.tvDesc != null && null != objBean.getDesc() && objBean.getDesc().trim().length() > 0)
        {
            holder.tvDesc.setText(Html.fromHtml(objBean.getDesc()));
        }
        if (holder.tvDate != null && null != objBean.getPubdate() && objBean.getPubdate().trim().length() > 0)
        {
            holder.tvDate.setText(Html.fromHtml(objBean.getPubdate()));
        }
        if (holder.imgView != null) 
        {
            if (null != objBean.getLink() && objBean.getLink().trim().length() > 0) 
            {
                final ProgressBar pbar = holder.pbar;

                pbar.setVisibility(View.INVISIBLE);


                //---------CHANGES MADE FOR LOADING IMAGE----------//

                Log.d("IMAGE NULL----------", objBean.getLink());


                //loadBitmap(objBean.getLink());

                /*new Thread() 
                {
                    public void run() 
                    {*/
                        try 
                        {
                            URL linkurl = new URL(objBean.getLink());

                            bitmap = BitmapFactory.decodeStream(linkurl.openConnection().getInputStream());

                            holder.imgView.setImageBitmap(bitmap);

                        } catch (MalformedURLException e) 
                        {
                            e.printStackTrace();

                        } catch (IOException e) 
                        {
                            e.printStackTrace();
                        }
                    /*}
                }.start();*/



            } else 
            {
                holder.imgView.setImageResource(R.drawable.ic_launcher);
            }
        }

        return view;
    }


    //------LOADING IMAGE FROM URL------//


    public static Bitmap loadBitmap(String url) 
    {
        Bitmap bitmap = null;

        final AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
        final HttpGet getRequest = new HttpGet(url);

        try 
        {
            HttpResponse response = client.execute(getRequest);
            final int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode != HttpStatus.SC_OK) 
            { 
                Log.d("ImageDownloader", "Error " + statusCode + " while retrieving bitmap from " + url); 
                return null;
            }

            final HttpEntity entity = response.getEntity();
            if (entity != null)
            {
                InputStream inputStream = null;
                try 
                {
                    inputStream = entity.getContent(); 

                    bitmap = BitmapFactory.decodeStream(inputStream);



                } finally
                {
                    if (inputStream != null)
                    {
                        inputStream.close();  
                    }
                    entity.consumeContent();
                }
            }
        } catch (Exception e) 
        {
            // Could provide a more explicit error message for IOException or IllegalStateException
            getRequest.abort();

            Log.d("Error while retrieving bitmap from " + url, e.toString());
        } finally 
        {
            if (client != null)
            {
                client.close();
            }
        }


        return bitmap;
    }




    public class ViewHolder
    {

        public TextView tvTitle, tvDesc, tvDate;
        private ImageView imgView;
        private ProgressBar pbar;

    }

}

and the main class is :

class MainActivity

public class MainActivity extends Activity implements OnItemClickListener
{
    private static final String rssFeed = /*"https://www.dropbox.com/s/t4o5wo6gdcnhgj8/imagelistview.xml?dl=1"*/"http://78.46.34.27/kapapps/newparsedtransaction.xml";

    List<Item> arrayOfList;
    ListView listView;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainnewtransaction);

        listView = (ListView) findViewById(R.id.listview);
        listView.setOnItemClickListener(this);

        if (Utils.isNetworkAvailable(NewTransactionActivity.this)) 
        {
            new MyTask().execute(rssFeed);
        } else 
        {
            showToast("No Network Connection!!!");
        }

    }

    // My AsyncTask start...

    class MyTask extends AsyncTask<String, Void, Void> 
    {

        ProgressDialog pDialog;

        @Override
        protected void onPreExecute() 
        {
            super.onPreExecute();

            pDialog = new ProgressDialog(NewTransactionActivity.this);
            pDialog.setTitle("Latest Transaction");
            pDialog.setMessage("Loading... Please wait");
            pDialog.show();

        }

        @Override
        protected Void doInBackground(String... params) 
        {
            arrayOfList = new NamesParser().getData(params[0]);
            return null;
        }

        @Override
        protected void onPostExecute(Void result) 
        {
            super.onPostExecute(result);



            if (null == arrayOfList || arrayOfList.size() == 0) 
            {

                showToast("No data found from web!!!");

                NewTransactionActivity.this.finish();

            } else 
            {

                // check data...
                /*
                 * for (int i = 0; i < arrayOfList.size(); i++) 
                 * { 
                 *  Item item = arrayOfList.get(i); System.out.println(item.getId());
                 *  System.out.println(item.getTitle());
                 *  System.out.println(item.getDesc());
                 *  System.out.println(item.getPubdate());
                 *  System.out.println(item.getLink()); 
                 * }
                 */
                for(int i = 0 ; i < arrayOfList.size() ; i++)
                {   
                    Item item = arrayOfList.get(i);
                    Log.d("ID NEWTRANSACTION ACTIVITY ------>" , item.getId());
                    Log.d("TITLE NEWTRANSACTION ACTIVITY ------>" , item.getTitle());
                    Log.d("DESC NEWTRANSACTION ACTIVITY ------>", item.getDesc());
                    Log.d("LINK NEWTRANSACTION ACTIVITY ------>", item.getLink());
                }

                setAdapterToListview();


            }


            if (null != pDialog && pDialog.isShowing()) 
            {
                pDialog.dismiss();
            }




        }
    }

    @Override
    public void onItemClick(AdapterView<?> parent , View view , int position ,  long id) 
    {
        Item item = arrayOfList.get(position);
        Intent intent = new Intent(NewTransactionActivity.this, DetailActivity.class);
        intent.putExtra("url", item.getLink());
        intent.putExtra("title", item.getTitle());
        intent.putExtra("desc", item.getDesc());


        Log.d("IMAGE_URL------>" , item.getLink());
        startActivity(intent);
    }

    public void setAdapterToListview() 
    {
        NewsRowAdapter objAdapter = new NewsRowAdapter(NewTransactionActivity.this , R.layout.row, arrayOfList);
        listView.setAdapter(objAdapter);
    }

    public void showToast(String msg) 
    {

    }


}

Upvotes: 1

Views: 270

Answers (3)

Rajesh
Rajesh

Reputation: 15774

I recommend using the RemoteImageView from the Prime library. It reduces your work a lot.

In your layout, replace ImageView with com.handlerexploit.prime.widgets.RemoteImageView and in your code, change ImageView to RemoteImageView in your holder class.

In the getView method,

holder.imgView = (RemoteImageView) view.findViewById(R.id.image);
//...
holder.imgView.setImageURL(objBean.getLink());

Upvotes: 0

Yaroslav Mytkalyk
Yaroslav Mytkalyk

Reputation: 17115

Use a single worker thread, and make it possible to stop in onPause() of activity. Good way is to use a SingleThread Executor service to load images.

Here's an example https://stackoverflow.com/a/14579365/1366471

Upvotes: 0

Azhar Khan
Azhar Khan

Reputation: 99

Do Image retrieving logic in another thread.It is taking too much time to load Images that's why you are getting ANR.

Upvotes: 1

Related Questions