【问题标题】:Getting image from an url ...the view stays empty从 url 获取图像...视图保持为空
【发布时间】:2014-01-21 00:00:17
【问题描述】:

在使用一些图像创建 Listview 的过程中,我决定执行 AsyncTask 来获取我的图像。所以我的代码是这样的:

private class StableArrayAdapter extends ArrayAdapter<Request>{
    private Context context;
    private Bitmap tempobmp;
    final User myUser = myapp.getUser();
    private List<Request> mylist;
    public StableArrayAdapter(Context context,List<Request> mylist){
        super(context, R.layout.request_layout, mylist);
        this.context = context;
        this.mylist = mylist;
    }public class ViewHolder{
        public ImageView image;
      }
    public View getView(int position,View convertView,ViewGroup parent){
        View vi = convertView; 

        if(vi==null){
            final Integer positionInt = position;
            final ViewHolder holder = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            vi = inflater.inflate(R.layout.request_layout,parent,false);vi.findViewById(R.id.totalLisV);
            holder.image = (ImageView) vi.findViewById(R.id.requestImage);

            vi.setTag(holder);
        }
        final ViewHolder holder = (ViewHolder) vi.getTag();
        final Request s = mylist.get(position);

        final User tempoUser = new User(s.getAsking_user().getUsername());
        tempoUser.fetch(new StackMobModelCallback(){

            @Override
            public void failure(StackMobException e) {
                // the call failed
            }

            @Override
            public void success() {
                // TODO Auto-generated method stub

            }
        });
        new GetImageData().execute(tempoUser,vi);


    return vi;
    }

在获取这张图片的过程中,魔法必须发生在 AsyncTask 中,如下所示(目前我使用硬编码的 url 进行测试):

private  class GetImageData extends AsyncTask<Object, Void, Bitmap> {
        private View myView;
        private Bitmap bmp = null;
        @Override
        protected Bitmap doInBackground(Object... users) {
            User user =(User) users[0];
            myView = (View)users[1];
            Bitmap bmp = null ;
            try{
            String urlString = "http://digital-photography-school.com/wp-content/uploads/2013/03/Acorn256.png";
            URL url = new URL(urlString);
            InputStream is = (InputStream) url.getContent();

            bmp = BitmapFactory.decodeStream(is);

            }
            catch(Exception e){
                Log.d("asykException","asykE"+e);
            }

            return bmp;
        }
        protected void onPostExecute(Bitmap result) {

            ImageView albumArt = (ImageView) myView.findViewById(R.id.requestImage);

            albumArt.setImageBitmap(bmp);
        }

    }

在这里,我遇到了一个非常奇怪的问题。确实在我的列表视图中,默认图像被替换为......什么都没有。 imageView 正方形保持透明。如果我在日志中检查位图状态,则返回之前的位图状态不为空。我的问题是:当我在 AsyncTask 中得到的 Bitmap 不为空时,为什么我得到一张透明的图片?

注意:无论我在 URL 中输入什么内容,都会发生此问题。

谢谢大家:)

【问题讨论】:

  • 这里的问题是在适配器创建视图后调用 asynctask,因此您需要更改适配器源数据然后通知您的数据源进行更改,您可以在创建适配器之前请求图像并在其中使用您的位图列表,或者您可以在图像完成获取图像后更新适配器
  • 我应该在我的 AsyncTask 中使用 View.invalidate() 吗?

标签: android listview bitmap android-asynctask adapter


【解决方案1】:

不要在 Adapter 类中调用 AsyncTask。我认为这不是一个好的做法,而且getView() 可能会在您的任务完成之前返回。因此,请改为从您的Activity 调用任务,然后在您的onPostExecute() 中初始化您的Adapter 并将其设置在您的ListView 上。或者,如果您已经初始化了 Adapter,那么您可以在 Adapter 上的 onPostExecute() 中调用 notifyDataSetChanged()。

【讨论】:

  • 我决定试一试你的第一个提议,它就像一个魅力。此外,我不得不说我从这种方法中得到了更好的表现。谢谢你:)
【解决方案2】:

您想从互联网上获取图像,请使用以下代码:

URL url = new URL(imgurl);
URLConnection con = url.openConnection();
con.connect();

InputStream is = con.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(is);
is.close();

现在你得到了 Bitmap 对象,只显示在 ImageView 上。就是这样。

【讨论】:

    【解决方案3】:

    不,您需要使用 notifyDatasetChange,因此适配器会将新内容添加到您的列表视图中,请在此处查看更多详细信息 Is ArrayAdapter thread safe in android? If not, what can I do to make it thread safe?

    但是这种方法不能很好地帮助你,你需要让你的列表视图更快,所以这里有一些提示如何在第 3 部分中以更快的方式将图像附加到列表视图)加载本文的图像

    http://optimizationtricks.blogspot.in/?utm_source=Android+Weekly&utm_campaign=d201f012d0-Android_Weekly_85&utm_medium=email&utm_term=0_4eb677ad19-d201f012d0-337298357

    这里的 Lib 将帮助您以更快的方式在 listview 上下载图像 https://github.com/nostra13/Android-Universal-Image-Loader

    希望对你有帮助

    【讨论】:

    • 链接 androidweekly 无处可去
    猜你喜欢
    • 1970-01-01
    • 2021-11-19
    • 2015-01-29
    • 1970-01-01
    • 2012-05-04
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多