为了账号安全,请及时绑定邮箱和手机立即绑定

使用Thread加载图片出现图片闪动三次才加载对图片

package com.example.asynctask;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.Message;
import android.support.v4.util.LruCache;
import android.util.Log;
import android.widget.ImageView;

public class LoadImgUrl {

    private ImageView itemImg;
    private String imgUrl;
    private LruCache<String, Bitmap> mImgCache;
    private Map<String, Thread> threadMap = new HashMap<String, Thread>();
    private Handler mHandler = new Handler(){
        public void handleMessage(Message msg) {
            if(itemImg.getTag()!= null && itemImg.getTag().equals(imgUrl)){
                ImageView threadImg = ((ItemBean)msg.obj).msgImg;
                Bitmap bitMap = ((ItemBean)msg.obj).bitMap;
                threadImg.setImageBitmap(bitMap);
            }
        };
    };
    public LoadImgUrl() {
        // TODO Auto-generated constructor stub
        int maxMemory = (int) Runtime.getRuntime().maxMemory() / 4;
        mImgCache = new LruCache<String, Bitmap>(maxMemory);
    }
    public void setImgUrl(ImageView img,final String url,int imgHolder) {
        this.itemImg = img;
        this.imgUrl = url;
        if (img.getTag() == null || !img.getTag().equals(url)) {
            img.setBackgroundResource(imgHolder);
            img.setTag(url);
        }
        Bitmap imgBitmap = getBitMapByLruc(url);
        if (imgBitmap == null) {
//            setBitmapByAsyncTask(url, img);
            Thread imgThread = threadMap.get(url);
            if (imgThread == null) {
                setBitmapByNewThread(url,img);
            }
        }else {
            img.setImageBitmap(imgBitmap);
        }
    }
    
    private void setBitmapByNewThread(final String url,final ImageView threadImg) {
        Thread newThread = new Thread(){
            @Override
            public void run() {
                // TODO Auto-generated method stub
                super.run();
                BufferedInputStream is = null;
                try {
                    is = new BufferedInputStream(new URL(url).openStream());
                    Thread.sleep(3000);
                } catch (MalformedURLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                Bitmap bitMap = BitmapFactory.decodeStream(is);
                putBitmapToLruc(bitMap, url);
                Message msg = Message.obtain();
                ItemBean itemBean = new ItemBean(threadImg, bitMap);
                msg.obj = itemBean;
                mHandler.sendMessage(msg);
            }
        };
        newThread.start();
        threadMap.put(url, newThread);
    }

    private void setBitmapByAsyncTask(String url,ImageView imgView) {
        new MyImgAsyncTask(url, imgView).execute();
    }
    
    private Bitmap getBitMapByLruc(String url) {
        return mImgCache.get(url);
    }
    
    private void putBitmapToLruc(Bitmap bitMap,String url) {
        mImgCache.put(url, bitMap);
    }

    class MyImgAsyncTask extends AsyncTask<String, Progress, Bitmap>{
        ImageView asItemImg;
        String imgUrl;
        public MyImgAsyncTask(String url,ImageView imgView) {
            // TODO Auto-generated constructor stub
            asItemImg = imgView;
            imgUrl = url;
        }
        @Override
        protected Bitmap doInBackground(String... params) {
            // TODO Auto-generated method stub
            Bitmap bitMap = null;
            try {
                BufferedInputStream bfIs = new BufferedInputStream(new URL(imgUrl).openStream());
                bitMap = BitmapFactory.decodeStream(bfIs);
                putBitmapToLruc(bitMap, imgUrl);
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return bitMap;
        }
        
        @Override
        protected void onPostExecute(Bitmap result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            asItemImg.setImageBitmap(result);
        }
    }
    
    class ItemBean{
        ImageView msgImg;
        Bitmap bitMap;
        public ItemBean(ImageView img,Bitmap bitmap) {
            // TODO Auto-generated constructor stub
            msgImg = img;
            this.bitMap = bitmap;
        }
    }
}


正在回答

2 回答


package com.example.asynctask;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.net.URI;
import java.net.URL;
import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class NewsListAdapter extends BaseAdapter {
    List<NewsBean> newsList;
    LayoutInflater lInflater;
    LoadImgUrl mLoadImgurl = new LoadImgUrl();
    public NewsListAdapter(Context context,List<NewsBean> newsList) {
        // TODO Auto-generated constructor stub
        lInflater = LayoutInflater.from(context);
        this.newsList = newsList;
    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return newsList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return newsList.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        ViewHolder viewHolder;
        NewsBean itemBean;
        if (convertView == null) {
            convertView = lInflater.inflate(R.layout.news_item, null);
            viewHolder = new ViewHolder();
            viewHolder.newsIconView = (ImageView) convertView.findViewById(R.id.newsIcon);
            viewHolder.titleLb = (TextView) convertView.findViewById(R.id.newTitle);
            viewHolder.subLb = (TextView) convertView.findViewById(R.id.newsSub);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        itemBean = newsList.get(position);
//        viewHolder.newsIconView.setBackgroundResource(R.drawable.ic_launcher);
//        viewHolder.newsIconView.setImageURI(new URI(itemBean.newsIcon));
//        new LoadImgUrl().setImgUrl(viewHolder.newsIconView, itemBean.newsIcon);
        mLoadImgurl.setImgUrl(viewHolder.newsIconView, itemBean.newsIcon,R.drawable.ic_launcher);
        viewHolder.titleLb.setText(itemBean.newsTitle);
        viewHolder.subLb.setText(itemBean.newSub);
        
        return convertView;
    }
    
    
    class ViewHolder{
        public ImageView newsIconView;
        public TextView titleLb;
        public TextView subLb;
    }

}

0 回复 有任何疑惑可以回复我~
  1. threadMap可以用线程池代替,具体是哪个类记不清楚了,好像是ThreadPool

  2. 你这里没必要用线程池(包括threadMap和我说的ThreadPool)

  3. 不太清楚你具体是怎么调用的,所以不敢妄言。不过只从当前代码看的话,你那个ThreadMap注释掉你再试试?

0 回复 有任何疑惑可以回复我~
#1

囧恩_姜戈 提问者

注释了还是一样的
2016-10-22 回复 有任何疑惑可以回复我~
#2

亲爱的Joe 回复 囧恩_姜戈 提问者

你怎么调用的啊?
2016-10-23 回复 有任何疑惑可以回复我~
#3

囧恩_姜戈 提问者 回复 亲爱的Joe

下面是listview的adapter
2016-10-24 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
Android必学-异步加载
  • 参与学习       50627    人
  • 解答问题       311    个

了解Android中的异步加载处理方法,这是面试问的最多的知识点

进入课程

使用Thread加载图片出现图片闪动三次才加载对图片

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信