网络资源

慕课网提供了获取课程信息的地址:http://www.imooc.com/api/teacher?type=4&num=30,可以获取json格式表述的30门课程的图标、标题、描述、学员数等信息。

{    "status": 1,    "data": [        {            "id": 1,            "name": "Tony老师聊shell——环境变量配置文件",            "picSmall": "http://img.mukewang.com/55237dcc0001128c06000338-300-170.jpg",            "picBig": "http://img.mukewang.com/55237dcc0001128c06000338.jpg",            "description": "为你带来shell中的环境变量配置文件",            "learner": 12312        },        {            "id": 2,            "name": "数学知识在CSS动画中的应用",            "picSmall": "http://img.mukewang.com/55249cf30001ae8a06000338-300-170.jpg",            "picBig": "http://img.mukewang.com/55249cf30001ae8a06000338.jpg",            "description": "数学知识与CSS结合实现酷炫效果",            "learner": 45625        },        ......    ],    "msg": "成功"}

实现效果

异步获取课程信息,并用ListView列表展示。


实现代码

activity_load_news.xml

<?xml version="1.0" encoding="utf-8"?>    

news_item.xml

<?xml version="1.0" encoding="utf-8"?>                            

LoadNewsActivity.java

public class LoadNewsActivity extends Activity {    private static final String URL = "http://www.imooc.com/api/teacher?type=4&num=30";    private ListView lv_news;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_load_news);        lv_news = (ListView) findViewById(R.id.lv_news);        new LoadNewsAsyncTask(this, lv_news).execute(URL);    }}

LoadNewsAsyncTask.java

/** * 异步加载网络资源 */public class LoadNewsAsyncTask extends AsyncTask> {    private Context ctx;    private ListView lv_news;    public LoadNewsAsyncTask(Context context, ListView lv) {        ctx = context;        lv_news = lv;    }    @Override    protected List doInBackground(String... strings) {        return getJsonData(strings[0]);    }    @Override    protected void onPostExecute(List newsBeans) {        super.onPostExecute(newsBeans);        NewsAdapter adapter = new NewsAdapter(ctx, newsBeans);        lv_news.setAdapter(adapter);    }    /**     * 通过url读取json     * @param url     * @return     */    private List getJsonData(String url) {        List newsBeanList = new ArrayList<>();        try {            String jsonString = readStream(new URL(url).openStream());            JSONObject jsonObject = new JSONObject(jsonString);            if (jsonObject != null) {                JSONArray jsonArray = jsonObject.getJSONArray("data");                if (jsonArray != null) {                    int count = jsonArray.length();                    for (int i = 0; i < count; i++) {                        JSONObject obj = jsonArray.getJSONObject(i);                        if (obj != null) {                            NewsBean bean = new NewsBean();                            bean.IconUrl = obj.getString("picSmall");                            bean.Title = obj.getString("name");                            bean.Content = obj.getString("description");                            newsBeanList.add(bean);                        }                    }                }            }        } catch (IOException e) {            e.printStackTrace();        } catch (JSONException e) {            e.printStackTrace();        }        return newsBeanList;    }    /**     * 读取inputstream中的文本     * @param is     * @return     */    private String readStream(InputStream is) {        InputStreamReader isr;        String result = "";        try {            String line = "";            isr = new InputStreamReader(is, "utf-8");            BufferedReader br = new BufferedReader(isr);            while ((line = br.readLine()) != null) {                result += line;            }        } catch (UnsupportedEncodingException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return result;    }}

NewsBean.java

/** * 封装json数据 */public class NewsBean {    /**     * 图标地址     */    public String IconUrl = "";    /**     * 标题     */    public String Title = "";    /**     * 内容     */    public String Content = "";}

NewsAdapter.java

public class NewsAdapter extends BaseAdapter {    private LayoutInflater inflater;    private List list;    public NewsAdapter(Context context, List newsBeanList) {        inflater = LayoutInflater.from(context);        list = newsBeanList;    }    @Override    public int getCount() {        return list.size();    }    @Override    public Object getItem(int i) {        return list.get(i);    }    @Override    public long getItemId(int i) {        return i;    }    @Override    public View getView(int i, View view, ViewGroup viewGroup) {        if (view == null) {            view = inflater.inflate(R.layout.news_item, null);            NewsBean bean = list.get(i);            ImageView imageView = (ImageView) view.findViewById(R.id.iv_news);            ImageLoader imageLoader = new ImageLoader(imageView, bean.IconUrl);//            imageLoader.showImageByThread();//异步加载图片            imageLoader.showImageByAsyncTask();            TextView txtTitle = (TextView) view.findViewById(R.id.tv_news_title);            txtTitle.setText(bean.Title);            TextView txtContent = (TextView) view.findViewById(R.id.tv_news_content);            txtContent.setText(bean.Content);        }        return view;    }}

ImageLoader.java

/** * 异步加载网络图片 */public class ImageLoader {    private ImageView iv;    private String urlAddress;    public ImageLoader(ImageView imageView, String url) {        iv = imageView;        urlAddress = url;    }    //region 多线程    /**     * 接收异步线程的消息,更新主线程的ui     */    private Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            iv.setImageBitmap((Bitmap) msg.obj);        }    };    /**     * 使用多线程异步加载图片     * 异步线程不能直接更新ui,需要利用Message     */    public void showImageByThread() {        new Thread(){            @Override            public void run() {                super.run();                //获取网络图片                Bitmap bitmap = getBitmapFromURL(urlAddress);                //通知主线程更新图片                Message message = Message.obtain();//获取现有的以及回收的message,提高message的使用效率                message.obj = bitmap;                handler.sendMessage(message);            }        }.start();    }    //endregion    //region AsyncTask方式    /**     * AsyncTask是在多线程的基础上进行了封装,可利用onPostExecute方法直接更新ui     */    public void showImageByAsyncTask() {        new LoadImageAsyncTask().execute(urlAddress);    }    class LoadImageAsyncTask extends AsyncTask {        @Override        protected Bitmap doInBackground(String... strings) {            return getBitmapFromURL(strings[0]);        }        @Override        protected void onPostExecute(Bitmap bitmap) {            super.onPostExecute(bitmap);            iv.setImageBitmap(bitmap);        }    }    //endregion    /**     * 加载网络图片     * @param urlString     * @return     */    private Bitmap getBitmapFromURL(String urlString) {        Bitmap bitmap = null;        InputStream is = null;        try {            URL url = new URL(urlString);            HttpURLConnection connection = (HttpURLConnection) url.openConnection();            is = new BufferedInputStream(connection.getInputStream());            bitmap = BitmapFactory.decodeStream(is);            connection.disconnect();        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        } finally {            try {                is.close();            } catch (IOException e) {                e.printStackTrace();            }        }        return bitmap;    }}

参考:http://www.imooc.com/learn/406

更多相关文章

  1. Android自定义圆形图片
  2. Android之手机电池电量应用
  3. Android中使用fresco加载图片
  4. (4.1.2.5)Android(安卓)屏幕旋转 处理 AsyncTask 和 ProgressDialo
  5. Android绘制圆形图片的3个方法
  6. android 百度API定位以及获取天气
  7. 如何在低版本的Android(安卓)SDK中生成缩略图——ThumbnailUtils
  8. android使用百度地图SDK获取定位信息示例
  9. [译] 了解 Android(安卓)的矢量图片格式:VectorDrawable

随机推荐

  1. Android关于socket编程,实现与服务器端通
  2. Android OpenSL介绍 并实现播放PCM功能
  3. Android学习问题:关于AlertDialog中自定义
  4. 由安装Busybox到Android过程中想到的
  5. Android Studio如何设置自己主动提示代码
  6. android 手势识别例子
  7. Android 4.0原生SDK发布,引入新的流式音频
  8. [Android学习笔记]资源(resources)的使用
  9. Android系统编译―Android.mk文件的简单
  10. Android(安卓)动画框架详解