代码已经托管到码云上,感兴趣的小伙伴可以下载看看

https://git.oschina.net/joy_yuan/MobilePlayer

本次的网络资源地址使用的是时光网的api接口,地址如下:

http://api.m.mtime.cn/PageSubArea/TrailerList.api
效果如下:

一、Xutils3 的使用

去github上看详解:https://github.com/wyouflf/xUtils3

xUtils3简介

  • xUtils 包含了orm, http(s), p_w_picpath, view注解, 但依然很轻量级(246K), 并且特性强大, 方便扩展:

    • 稳定的基石AbsTask和统一的回调接口Callback, 任何异常, 即使你的回调方法实现有异常都会进入onError, 任何情况下onFinished总会让你知道任务结束了.

    • 基于高效稳定的orm工具, http模块得以更方便的实现cookie(支持domain, path, expiry等特性)和 缓存(支持Cache-Control, Last-Modified, ETag等特性)的支持.

    • 有了强大的http及其下载缓存的支持, p_w_picpath模块的实现相当的简洁, 并且支持回收被view持有, 但被Mem Cache移除的图片, 减少页面回退时的闪烁..

    • view注解模块仅仅400多行代码却灵活的支持了各种View注入和事件绑定, 包括拥有多了方法的listener的支持.

其他特性

  • 支持超大文件(超过2G)上传

  • 更全面的http请求协议支持(11种谓词)

  • 拥有更加灵活的ORM, 和greenDao一致的性能

  • 更多的事件注解支持且不受混淆影响...

  • 图片绑定支持gif(受系统兼容性影响, 部分gif文件只能静态显示), webp; 支持圆角, 圆形, 方形等裁剪, 支持自动旋转...

  • 从3.5.0开始不再包含libwebpbackport.so, 需要在Android4.2以下设备兼容webp的请使用3.4.0版本.

1.1、在Android studio中添加xutils3的方法:

a   在build.gradle里添加依赖

compile 'org.xutils:xutils:3.5.0'

b    添加权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

c 新建一个MyApplication类extends Application ,然后重写里面的onCreate()方法,在里面初始化xutils

package com.yuanlp.mobileplayer;import android.app.Application;import org.xutils.x;/*** Created by 原立鹏 on 2017/7/26.*/public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();x.Ext.init(this);x.Ext.setDebug(BuildConfig.DEBUG); // 是否输出debug日志, 开启debug会影响性能.}
}

d 、利用xutils的注解方法,来实例化布局里的控件

1)、网络视频也是一个listview,因此主页面与本地视频的主页面类似,

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><com.yuanlp.mobileplayer.view.XListViewandroid:divider="@null"android:id="@+id/listview"android:layout_width="match_parent"android:layout_height="match_parent"></com.yuanlp.mobileplayer.view.XListView><TextViewandroid:visibility="gone"android:textSize="18sp"android:textColor="#000000"android:id="@+id/tv_nonet"android:text="没有网络"android:layout_centerInParent="true"android:layout_width="wrap_content"android:layout_height="wrap_content"/><ProgressBarandroid:layout_centerInParent="true"android:id="@+id/pb_loading"android:layout_width="wrap_content"android:layout_height="wrap_content"/></RelativeLayout>

2)然后就是每个listview的item的布局,有图片和linearlayout

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="100dp"android:gravity="center_vertical"><RelativeLayoutandroid:layout_centerVertical="true"android:id="@+id/rl_p_w_picpath"android:layout_width="120dp"android:layout_height="80dp"><ImageViewandroid:id="@+id/iv_icon"android:scaleType="fitXY"android:src="@drawable/video_default"android:layout_width="match_parent"android:layout_height="match_parent"/><ImageViewandroid:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:layout_marginRight="8dp"android:layout_marginBottom="8dp"android:src="@drawable/center_collect_play"android:layout_width="wrap_content"android:layout_height="wrap_content"/></RelativeLayout><LinearLayoutandroid:layout_centerVertical="true"android:layout_toRightOf="@+id/rl_p_w_picpath"android:orientation="vertical"android:layout_marginLeft="8dp"android:layout_width="match_parent"android:layout_height="wrap_content"><TextViewandroid:id="@+id/tv_name"android:text="视频名称"android:textSize="18sp"android:maxLines="1"android:textColor="#000000"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/tv_videotitle"android:text="视频描述"android:textSize="18sp"android:layout_marginTop="8dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout></RelativeLayout>

1.2、 利用xutils获取网络资源

a 利用xutils的x.http().get(params,callback);来获取网络资源,不管获取成功与否,都在callback里有回调方法:

Constants.NET_URL="http://api.m.mtime.cn/PageSubArea/TrailerList.api";
RequestParams params=new RequestParams(Constants.NET_URL);
x.http().get(params, new Callback.CommonCallback<String>() {  //回调公用的一个String@Overridepublic void onSuccess(String result) {LogUtil.e("联网成功"+result);//解析数据,获取数据并展示adapterprogressData(result);//将获取的数据保存CacheUtils.putString(context,Constants.NET_URL,result);//设置item点击事件listview.setOnItemClickListener(new MyOnItemClickListener());}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {LogUtil.e("联网失败"+ex.getMessage());nonet.setVisibility(View.VISIBLE); //文本显示没网络数据pb_loading.setVisibility(View.GONE);}@Overridepublic void onCancelled(CancelledException cex) {LogUtil.e("onCancelled"+cex.getMessage());}@Overridepublic void onFinished() {LogUtil.e("onFinished");}
});private void progressData(String result) {if (!isloadMore){mediaList=progressJson(result);showData();pb_loading.setVisibility(View.GONE);  //progressbar隐藏}else{//加载更多,那么就把新的list加入到原有的list中ArrayList<MediaItem> moreMediaList=progressJson(result);mediaList.addAll(moreMediaList);//刷新适配器netvideoAdap.notifyDataSetChanged();isloadMore=false;onLoad();}
}private void showData() {if (mediaList!=null&&mediaList.size()>0){nonet.setVisibility(View.GONE);  //隐藏文本netvideoAdap = new NetVideoAdapter(context,mediaList);//设置适配器listview.setAdapter(netvideoAdap);onLoad(); //重新加载listview数据}else {nonet.setVisibility(View.VISIBLE); //文本显示没网络数据}
}/*** 解析json有2中方法:* 1、利用系统接口* 2、利用第三方接口,如gson,fastjson* @param json* @return*/
private ArrayList<MediaItem> progressJson(String json) {ArrayList<MediaItem> mediaItems=new ArrayList<>();//利用系统来解析jsontry {JSONObject jsonObject=new JSONObject(json);JSONArray trailers = jsonObject.optJSONArray("trailers");//利用这个方法,来获取一个数组if (trailers!=null&&trailers.length()>0){for (int i=0;i<trailers.length();i++){JSONObject object = (JSONObject) trailers.get(i);if (object!=null){MediaItem item=new MediaItem();String movieName = object.getString("movieName");item.setName(movieName);String videoTitle=object.getString("videoTitle");item.setVideoTitle(videoTitle);String coverImg=object.getString("coverImg");item.setCoverImg(coverImg);String hightUrl=object.getString("hightUrl");item.setData(hightUrl);LogUtil.e("电影名字:"+movieName);mediaItems.add(item);}}}} catch (JSONException e) {e.printStackTrace();}return mediaItems;}

二、Glide的使用

在build.gradle里添加依赖,然后sync一下就可以了

compile 'com.github.bumptech.glide:glide:3.6.1'

在网络资源的adapter里,设置图片的网络资源时,用Glide最好,这样子模拟机与真机里都可以获取到图片。

Glide.().load(item.getCoverImg()).into(viewHolder.);

具体的adapter代码如下:

package com.yuanlp.mobileplayer.adapter;import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;import com.bumptech.glide.Glide;
import com.yuanlp.mobileplayer.R;
import com.yuanlp.mobileplayer.bean.MediaItem;
import com.yuanlp.mobileplayer.utils.Utils;import java.util.ArrayList;/*** Created by 原立鹏 on 2017/7/26.*/public class NetVideoAdapter extends BaseAdapter {private Context context;private ArrayList<MediaItem> mediaList;private Utils utils;private static Bitmap bitmap;public NetVideoAdapter(Context context, ArrayList<MediaItem> mediaList){this.context=context;this.mediaList=mediaList;}@Overridepublic int getCount() {return mediaList.size();}@Overridepublic Object getItem(int position) {return mediaList.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ViewHolder viewHolder=null;if (convertView==null){View view = LayoutInflater.from(context).inflate(R.layout.netmedialayout, null);convertView=view;viewHolder=new ViewHolder();viewHolder.iv_icon= (ImageView) convertView.findViewById(R.id.iv_icon);viewHolder.tv_name= (TextView) convertView.findViewById(R.id.tv_name);viewHolder.tv_videotitle= (TextView) convertView.findViewById(R.id.tv_videotitle);convertView.setTag(viewHolder);}else{viewHolder= (ViewHolder) convertView.getTag();}//得到数据MediaItem item=mediaList.get(position);viewHolder.tv_name.setText(item.getName());viewHolder.tv_videotitle.setText(item.getVideoTitle());Glide.with(context).load(item.getCoverImg()).into(viewHolder.iv_icon);// x.p_w_picpath().bind(viewHolder.iv_icon,item.getCoverImg());return convertView;}/*** 公共的控件类,里面包含每一行要显示的控件*/private static class ViewHolder{ImageView iv_icon;TextView tv_name;TextView tv_time;TextView tv_size;TextView tv_videotitle;}
}

三、下拉刷新,xListView

在这里下拉刷新我用的是网络上的一个Xlistview,可以到github上下载

下载好之后,把src文件夹里的XListView 、XListViewFooter、XListViewHeader拷贝到自己的项目里,然后把res里对应的布局文件拷贝过去。

然后把上面的自定义的网络资源里的布局文件的listview的类,指向我们刚才拷贝的XlistView

当设置好listview的setAdapter后,我们要设置listview的上拉、下拉刷新

listview.setPullLoadEnable(true);listview.setXListViewListener(new MyXListViewListener());class MyXListViewListener implements XListView.IXListViewListener {@Overridepublic void onRefresh() {getData();}@Overridepublic void onLoadMore() {RequestParams params=new RequestParams(Constants.NET_URL);x.http().get(params, new Callback.CommonCallback<String>() {  //回调公用的一个String@Overridepublic void onSuccess(String result) {LogUtil.e("联网成功"+result);isloadMore=true;//解析数据,获取数据并展示adapterprogressData(result);listview.setOnItemClickListener(new MyOnItemClickListener());}@Overridepublic void onError(Throwable ex, boolean isOnCallback) {LogUtil.e("联网失败"+ex.getMessage());isloadMore=false;nonet.setVisibility(View.VISIBLE); //文本显示没网络数据pb_loading.setVisibility(View.GONE);}@Overridepublic void onCancelled(CancelledException cex) {LogUtil.e("onCancelled"+cex.getMessage());isloadMore=false;}@Overridepublic void onFinished() {LogUtil.e("onFinished");isloadMore=false;}});}
}/*** 重新加载adapter里的数据*/
private void onLoad() {listview.stopRefresh();listview.stopLoadMore();listview.setRefreshTime("更新时间"+getSystemTime());
}

在这里我们写了listview的上拉下拉监听回调方法。

a 、 当下拉时,重新去刷新数据,相当于去重新请求该api地址的数据。

b 、在上拉时,去获取新的数据,放到list里,然后setAdapter。这里由于数据固定,就每次上拉时,把原先的list拷贝一份加进去,相当于2个list的数据。

四、当有网络时,把网络资源保存到本地,断网后,再打开应用可以将资源展现。

定义一个CacheUtils类,来实现get/set网络资源

package com.yuanlp.mobileplayer.utils;import android.content.Context;
import android.content.SharedPreferences;/*** Created by 原立鹏 on 2017/7/26.** 当网络断掉时,之前访问的网络视频资源保存到本地*/public class CacheUtils {public static void putString(Context context,String key,String values){//创建一个私有的文件SharedPreferences sharedPreferences=context.getSharedPreferences("yuan",Context.MODE_PRIVATE);sharedPreferences.edit().putString(key,values).commit();}public static String  getString(Context context,String key){SharedPreferences sharedPreferences=context.getSharedPreferences("yuan",Context.MODE_PRIVATE);return sharedPreferences.getString(key,""); //默认返回空字符串}
}

这样在有网络时,就把数据存到本地

/*** 获取网络数据*/
public void getData() {RequestParams params=new RequestParams(Constants.NET_URL);x.http().get(params, new Callback.CommonCallback<String>() {  //回调公用的一个String@Overridepublic void onSuccess(String result) {LogUtil.e("联网成功"+result);//解析数据,获取数据并展示adapterprogressData(result);//将获取的数据保存到本地CacheUtils.putString(context,Constants.NET_URL,result);//设置item点击事件listview.setOnItemClickListener(new MyOnItemClickListener());}。。。。

当初始化时,回去读取本地视频,如果有,则去读取并展示

@Override
public void initData() {super.initData();//获取网络数据getData();LogUtil.e("网络视频页面的数据被初始化了");//获取之前有网络时保存的数据String jsonResult=CacheUtils.getString(context,Constants.NET_URL);//当有本地数据时,去解析本地数据if (!TextUtils.isEmpty(jsonResult)){progressData(jsonResult);}listview.setPullLoadEnable(true);listview.setXListViewListener(new MyXListViewListener());}

转载于:https://blog.51cto.com/cm0425/1951257

手机影音第十三天,xutils3、Glide的使用获取网络图片;下拉、上滑刷新;缓存网络资源...相关推荐

  1. Android视频《手机影音_项目实战》-杨光福-专题视频课程

    Android视频<手机影音_项目实战>-49877人已学习 课程介绍         手机影音项目是真实的上线项目,本视频在原项目基础上,进行了新技术的更新和优化.该项目包括本地音乐播放 ...

  2. Android 手机影音 开发过程记录(六)

    Android 手机影音 开发过程记录(六) 前一篇已经将音乐播放及切换的相关逻辑弄好了,今天主要理一下剩余的部分,包含: 1. 自己定义通知栏的布局及逻辑处理 2. 滚动歌词的绘制 3. 歌词解析 ...

  3. Studio项目实战开发手机影音播放器(Android版)

    AndroidStudio项目实战开发安卓播放器(手机影音) 下载地址:百度网盘

  4. 最新AndroidStudio项目实战开发安卓播放器(手机影音)

    AndroidStudio项目实战开发安卓播放器(手机影音) 下载地址:百度网盘

  5. Kotlin项目实战之手机影音---悦单条目实现及BaseListFragment抽取

    悦单条目自定义及界面适配: 阐述: 距离上一次https://www.cnblogs.com/webor2006/p/13193142.html这块的学习已经相隔快半年了..基本也把它快要遗忘在脑海里 ...

  6. Android获取Linux图像信息,Android系统信息获取 之十三:Linux内核版本信息获取

    Android系统信息获取 之十三:Linux内核版本信息获取 Android系统是基于Linux的,各个Android版本对应的Linux版本不尽相同,我们这里不去追究各个Android对应的Lin ...

  7. Glide获取网络图片宽高,并动态设置图片宽高

    ​ 因Android手机屏幕尺寸较多,当imageview宽设置match_parent,高固定时.会导致图片拉伸或裁剪.目前可通过获取图片宽高,动态设置imageview宽高比例,等比例缩放图片. ...

  8. 华为手机业务网络推广外包持续受限,在当前市场下还能做些什么?

    日前据外媒报道称,美国政府现如今已经对华为智能手机业务市场作出限制将再延长六个月,而华为旗下网络推广外包业务产品中包括智能手机.移动宽带终端以及终端云等,其中华为智能手机凭借华为全球化的网络优势将华为 ...

  9. 华为手机下拉菜单变大_不能不知的华为手机菜单栏,知道3个的算你手机没白买!...

    大家都知道华为手机有很多好用的功能,那么华为手机菜单栏的这些按钮都表示什么意思?你知道吗?今天咱们就一起来看看! 第一行 1.WLAN 这个是我们的无线网络按钮,大家可以在里面选择自己需要连接的网络, ...

最新文章

  1. 移动手机平台的HTML5前端优化指南
  2. mybatis 做 insert操作的时候返回插入的那条数据的id
  3. jsp页面页面post传值_几种JSP页面传值方式
  4. 第一个脚本-HelloWorld
  5. LeetCode62 Unique Paths
  6. 【LeetCode】【字符串】题号:*151. 翻转字符串里的单词
  7. 支持向量机总结(SVM)
  8. C++/QT控制通过VISA控制硬件设备,超级容易学会的控制硬件方法
  9. matlab 取点画图,matlab如何画图
  10. 飞秋2013官方下载
  11. 逆概率加权法(Inverse Probability Weighting, IPW)的原理及R实现
  12. 一种精细化计算设备状态的方法
  13. 安卓手机通过USB连接路由器有线上网
  14. w10计算机怎么恢复出厂设置路由器,win10无线路由器设置步骤图_win10重置路由器后怎么设置...
  15. UIToolBar实现高斯模糊
  16. MySQL Overview
  17. Photoshop 快速抠图:使用快速选择工具
  18. 2020-01-03 KK日记,第一次进行postgresql 11.5+pgpool 安装
  19. web学习入门资源总结
  20. 高红冰:淘宝村促进乡村振兴

热门文章

  1. C#中的复制在unity中使用
  2. AJAX - 创建XMLHttpRequest 对象
  3. Servlet的使用你掌握多少?
  4. 软件测试--selenium安装使用
  5. Jmeter基础使用
  6. 03-01 appium架构介绍与环境安装
  7. 三相pmsm矢量控制仿真模型_实时控制系统的时序模型及其在AUTOSAR系统仿真监控中的应用-Foundations4.1控制理论...
  8. ih5怎么切换下一个页面_区块链是下一个风口?那PPT该怎么做?
  9. Python基本操作(五) 标准数据类型(不可变类型)
  10. 太真实了!有个程序员男友原来是这样的!