从网址获取图片...视图保持空白

时间:2014-01-21 00:00:17

标签: android listview bitmap android-asynctask adapter

在使用某些图像创建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);
        }

    }

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

注意:无论我在网址中添加什么内容,都会发生此问题。

谢谢你们:)

3 个答案:

答案 0 :(得分:1)

您想从Internet获取图片,请使用以下代码:

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

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

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

答案 1 :(得分:1)

请勿致电AsyncTask课程中的Adapter。我认为这不是好的做法加上getView()可能在您的任务完成之前返回。因此,请从Activity调用该任务,然后在onPostExecute()中初始化Adapter并将其设置在ListView上。或者,如果您已初始化Adapter,则可以在notifyDataSetChanged()的{​​{1}}上致电Adapter

答案 2 :(得分:1)

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

但是这种方法对你需要更快地使你的列表视图更有帮助,所以这里有一些提示如何以更快的方式将图像附加到listview第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

希望这能帮到你