使用Handler加載網絡圖片,設置ListView

加載網絡圖片生成listview,經過打開網絡鏈接,經過異步線程處理網絡加載,並設置圖片android

MainActivity代碼json

鏈接網絡,解析JSON代碼,將所解析出的Json對象封存,添加到List中並與以後自定義的Adapter關聯api

public class MainActivity extends AppCompatActivity {
    private List<Newsbeans> mlist;
    private static  String url="http://www.imooc.com/api/teacher?type=4&num=30";
    private ListView listView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Myaysctask myaysctask=new Myaysctask();
        //將url傳遞進去實現對於url的異步訪問
        new Myaysctask().execute(url);
        listView= (ListView) findViewById(R.id.listview);
    }
    //將url轉化爲咱們所須要的json對象
    private List<Newsbeans> getjsondata(String url){
        //初始化list
        mlist=new ArrayList<>();
        JSONObject jsonObject=null;
        Newsbeans newsbeans=new Newsbeans();
        try {
            //獲取字節流
            String jsonstring= readStream(new URL(url).openStream());
            //將傳入的字節流轉化爲json對象
            jsonObject=new JSONObject(jsonstring);
            //獲得json下的data下的數組
            JSONArray jsonArray=jsonObject.getJSONArray("data");

            for(int i=0;i<jsonArray.length();i++){
                //遍歷json數組的到jsonobject的值
                jsonObject=jsonArray.getJSONObject(i);
                newsbeans=new Newsbeans();
                //將jsonobject中的值賦予到已經封裝好的值之中
                newsbeans.newscontent=jsonObject.getString("description");
                newsbeans.newspic=jsonObject.getString("picSmall");
                newsbeans.newstitle=jsonObject.getString("name");
                //將newsbeans添加到list之中
                mlist.add(newsbeans);
            }
        } catch (IOException | JSONException e) {
            e.printStackTrace();
        }
        return mlist;
    }
    private String readStream(InputStream is){
        String result="";
        String line="";
        try {
            //將inputstream傳入的爲字節流,經過inputstreamreader將字節流轉換爲字符流
            InputStreamReader irs=new InputStreamReader(is,"utf-8");
            //經過bufferedreader將輸入流讀取出來
            BufferedReader br= new BufferedReader(irs);
            while ((line= br.readLine())!=null){
                result+=line;
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;
    }
    class Myaysctask extends AsyncTask<String,Void,List<Newsbeans>>{

        @Override
        //進行全部的耗時操做但不包括更改UI
        protected List<Newsbeans> doInBackground(String... strings) {
            //將string數組中的0位返回也就是傳入url
            return getjsondata(strings[0]);
        }

        @Override
//加載所需的adapter
protected void onPostExecute(List<Newsbeans> newsbeans) { Myadapter myadapter=new Myadapter(MainActivity.this,newsbeans); listView.setAdapter(myadapter); super.onPostExecute(newsbeans); } } }

使用高效的adapter,關聯listview數組

 1 public class Myadapter extends BaseAdapter {
 2     private Context context;
 3     private List<Newsbeans> mlist;
 4     private LayoutInflater mlayoutinflater;
 5     public Myadapter(Context context, List<Newsbeans> mlist1){
 6         mlist=mlist1;
 7         mlayoutinflater=LayoutInflater.from(context);
 8     }
 9     @Override
10     public int getCount() {
11 
12         return mlist.size();
13     }
14 
15     @Override
16     public Object getItem(int i) {
17         return mlist.get(i);
18     }
19 
20     @Override
21     public long getItemId(int i) {
22         return i;
23     }
24 
25     @Override
26     public View getView(int i, View convertview, ViewGroup viewGroup) {
27         Viewholder viewholder=null;
28         if(convertview==null){
29             viewholder=new Viewholder();
30             //將item的layout文件轉化爲view,必須是item文件在以後的view中還要找到對應的控件
31             convertview=mlayoutinflater.inflate(R.layout.item,null);
32             viewholder.contenttext= (TextView)convertview.findViewById(R.id.tv_content);
33             viewholder.imageView=(ImageView)convertview.findViewById(R.id.imageview);
34             viewholder.titletext=(TextView)convertview.findViewById(R.id.tv_title);
35             convertview.setTag(viewholder);
36         }
37             else {
38             viewholder=(Viewholder)convertview.getTag();
39         }
40             Newsbeans newsbeans=mlist.get(i);
41             viewholder.imageView.setImageResource(R.mipmap.ic_launcher);
42             //調用方法傳遞所需信息
43             new ImageviewHolder().newthread(viewholder.imageView,mlist.get(i).newspic);
44             viewholder.imageView.setTag(mlist.get(i).newspic);
45             viewholder.titletext.setText(newsbeans.newstitle);
46             viewholder.contenttext.setText(newsbeans.newscontent);
47         return convertview;
48     }
49     class Viewholder{
50         public TextView titletext;
51         public TextView contenttext;
52         public ImageView imageView;
53     }
54 }

使用Handler加載網絡圖片緩存

 1 public class ImageviewHolder {
 2     //設置全局變量
 3     private ImageView mImageView;
 4     private String mURL;
 5     //定義handler,在handler之中設定UI
 6     private android.os.Handler mHadler= new android.os.Handler(){
 7         @Override
 8         public void handleMessage(Message msg) {
 9             //因爲Listview的緩存屬性,在設加載UI的時候可能會出現重複加載的狀況
10             if(mImageView.getTag().equals(mURL)){
11                 mImageView.setImageBitmap((Bitmap) msg.obj);
12             }
13 
14             super.handleMessage(msg);
15         }
16     };
17     public void newthread(ImageView imageView, final String url){
18         mImageView=imageView;
19         mURL=url;
20         //進行全部的耗時操做
21         new Thread(){
22             @Override
23             public void run(){
24                 try {
25                     Thread.sleep(2000);
26                     Message message=new Message();
27                     //傳遞信息,將message的obj設置爲一個bitmap並傳遞給handler設置UI
28                     message.obj=getbitmapstream(url);
29                     mHadler.sendMessage(message);
30                 } catch (IOException | InterruptedException e) {
31                     e.printStackTrace();
32                 }
33                 super.run();
34                 }
35             }.start();
36         }
37     public Bitmap getbitmapstream(String bitmapurl) throws IOException {
38         InputStream is=null;
39         try {
40             //指向互聯網資源的指針
41             URL url=new URL(bitmapurl);
42             //打開鏈接,並強行轉換格式
43             HttpURLConnection connection= (HttpURLConnection) url.openConnection();
44             //獲取輸入的數據流
45             is=new BufferedInputStream(connection.getInputStream());
46             //解析所傳入的數據
47             Bitmap bitmap= BitmapFactory.decodeStream(is);
48             //斷開鏈接
49             connection.disconnect();
50             return bitmap;
51         } catch (IOException e) {
52             e.printStackTrace();
53         }
54         finally {
55             //斷開數據流
56             assert is != null;
57             is.close();
58         }
59         return null;
60     }
61     }
相關文章
相關標籤/搜索