Android 在从 Url 加载图像时没有响应

标签 android image xml-parsing loading

我正在尝试解析 xml 文件并尝试加载图像和 TextView 并将其显示在 ListView 中但是每当我尝试在 getView 方法中加载图像时强制关闭应用程序即使尝试快速滚动它也会执行相同的。我厌倦了在线程和异步任务中做 5 个小时。如果有人能解决它,请帮忙。这是我的两个类文件。

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;

    }

}

主类是:

类主 Activity

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) 
    {

    }


}

最佳答案

在另一个线程中执行图像检索逻辑。加载图像花费的时间太多,这就是您收到 ANR 的原因。

关于Android 在从 Url 加载图像时没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14753192/

相关文章:

ISO-8859-9 的 java xml 解析

android - 为什么我在模拟器中看不到视频?

php - 使用 PHP 简单 HTML dom 解析器搜索元素名称

java - XML DOM 解析,在每个 getNodeValue() 上获取 NULL

java - 如何使用 Java 服务器将图像发送到 Android 设备

php - Ajax 或 jquery 客户端裁剪和调整大小库,通过 http 请求将裁剪后的文件发送到服务器

image - 如何使用matlab使用对象的边界框裁剪图像中检测到的对象

android - 旋转设备时磁场测量的奇怪行为

android - 如何将白色设置为 google+ 登录按钮?

java - 将 api 级别 android 版本从 8 更改为 12 时出错