OkHttp3Util
public class OkHttp3Util {
private static OkHttpClient okHttpClient = null;
private OkHttp3Util() {
}
public static OkHttpClient getInstance() {
if (okHttpClient == null) {
//加同步安全
synchronized (OkHttp3Util.class) {
if (okHttpClient == null) {
//okhttp可以缓存数据....指定缓存路径
File sdcache = new File(Environment.getExternalStorageDirectory(), "cache");
//指定缓存大小
int cacheSize = 10 * 1024 * 1024;
okHttpClient = new OkHttpClient.Builder()//构建器
.connectTimeout(15, TimeUnit.SECONDS)//连接超时
.writeTimeout(20, TimeUnit.SECONDS)//写入超时
.readTimeout(20, TimeUnit.SECONDS)//读取超时
.cache(new Cache(sdcache.getAbsoluteFile(), cacheSize))//设置缓存
.build();
}
}
}
return okHttpClient;
}
/**
* get请求
* 参数1 url
* 参数2 回调Callback
*/
public static void doGet(String oldUrl, Callback callback) {
//创建OkHttpClient请求对象
OkHttpClient okHttpClient = getInstance();
//创建Request
Request request = new Request.Builder().url(oldUrl).build();
//得到Call对象
Call call = okHttpClient.newCall(request);
//执行异步请求
call.enqueue(callback);
}
/**
* post请求
* 参数1 url
* 参数2 Map<String, String> params post请求的时候给服务器传的数据
* add..("","")
* add()
*/
public static void doPost(String url, Map<String, String> params, Callback callback) {
//创建OkHttpClient请求对象
OkHttpClient okHttpClient = getInstance();
//3.x版本post请求换成FormBody 封装键值对参数
FormBody.Builder builder = new FormBody.Builder();
//遍历集合,,,map集合遍历方式
for (String key : params.keySet()) {
builder.add(key, params.get(key));
}
//创建Request....formBody...new formBody.Builder()...add()....build()
Request request = new Request.Builder().url(url).post(builder.build()).build();
Call call = okHttpClient.newCall(request);
call.enqueue(callback);
}
/**
* post请求上传文件....包括图片....流的形式传任意文件...
* 参数1 url
* file表示上传的文件
* fileName....文件的名字,,例如aaa.jpg
* params ....传递除了file文件 其他的参数放到map集合
*
*/
public static void uploadFile(String url, File file, String fileName,Map<String,String> params,Callback callback) {
//创建OkHttpClient请求对象
OkHttpClient okHttpClient = getInstance();
//MultipartBody多功能的请求实体对象,,,formBody只能传表单形式的数据
MultipartBody.Builder builder = new MultipartBody.Builder();
builder.setType(MultipartBody.FORM);
//参数
if (params != null){
for (String key : params.keySet()){
builder.addFormDataPart(key,params.get(key));
}
}
//文件...参数name指的是请求路径中所接受的参数...如果路径接收参数键值是fileeeee,此处应该改变
builder.addFormDataPart("file",fileName,RequestBody.create(MediaType.parse("application/octet-stream"),file));
//构建
MultipartBody multipartBody = builder.build();
//创建Request
Request request = new Request.Builder().url(url).post(multipartBody).build();
//得到Call
Call call = okHttpClient.newCall(request);
//执行请求
call.enqueue(callback);
}
/**
* Post请求发送JSON数据....{"name":"zhangsan","pwd":"123456"}
* 参数一:请求Url
* 参数二:请求的JSON
* 参数三:请求回调
*/
public static void doPostJson(String url, String jsonParams, Callback callback) {
RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), jsonParams);
Request request = new Request.Builder().url(url).post(requestBody).build();
Call call = getInstance().newCall(request);
call.enqueue(callback);
}
/**
* 下载文件 以流的形式把apk写入的指定文件 得到file后进行安装
* 参数er:请求Url
* 参数san:保存文件的文件夹....download
*/
public static void download(final Activity context, final String url, final String saveDir) {
Request request = new Request.Builder().url(url).build();
Call call = getInstance().newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
//com.orhanobut.logger.Logger.e(e.getLocalizedMessage());
}
@Override
public void onResponse(Call call, final Response response) throws IOException {
InputStream is = null;
byte[] buf = new byte[2048];
int len = 0;
FileOutputStream fos = null;
try {
is = response.body().byteStream();//以字节流的形式拿回响应实体内容
//apk保存路径
final String fileDir = isExistDir(saveDir);
//文件
File file = new File(fileDir, getNameFromUrl(url));
fos = new FileOutputStream(file);
while ((len = is.read(buf)) != -1) {
fos.write(buf, 0, len);
}
fos.flush();
context.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "下载成功:" + fileDir + "," + getNameFromUrl(url), Toast.LENGTH_SHORT).show();
}
});
//apk下载完成后 调用系统的安装方法
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
context.startActivity(intent);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (is != null) is.close();
if (fos != null) fos.close();
}
}
});
}
/**
* 判断下载目录是否存在......并返回绝对路径
*
* @param saveDir
* @return
* @throws IOException
*/
public static String isExistDir(String saveDir) throws IOException {
// 下载位置
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
File downloadFile = new File(Environment.getExternalStorageDirectory(), saveDir);
if (!downloadFile.mkdirs()) {
downloadFile.createNewFile();
}
String savePath = downloadFile.getAbsolutePath();
Log.e("savePath", savePath);
return savePath;
}
return null;
}
/**
* @param url
* @return 从下载连接中解析出文件名
*/
private static String getNameFromUrl(String url) {
return url.substring(url.lastIndexOf("/") + 1);
}
}
RetrofitAndOkhttpAndRxAndriodUtil
public class RetrofitAndOkhttpAndRxAndriodUtil {
public static OkHttpClient okHttpClient = new OkHttpClient.Builder()
// .cookieJar(new CookiesManager())
.connectTimeout(20, TimeUnit.SECONDS)
.readTimeout(20, TimeUnit.SECONDS)
.writeTimeout(20, TimeUnit.SECONDS)
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
//获取到请求
Request request = chain.request();
//获取请求的方式
String method = request.method();
//获取请求的路径
String oldUrl = request.url().toString();
Log.e("---拦截器",request.url()+"---"+request.method()+"--"+request.header("User-agent"));
//要添加的公共参数...map
Map<String,String> map = new HashMap<>();
map.put("source","android");
if ("GET".equals(method)){
StringBuilder stringBuilder = new StringBuilder();//创建一个stringBuilder
stringBuilder.append(oldUrl);
if (oldUrl.contains("?")){
if (oldUrl.indexOf("?") == oldUrl.length()-1){
}else {
stringBuilder.append("&");
}
}else {
stringBuilder.append("?");
}
//添加公共参数....
for (Map.Entry<String,String> entry: map.entrySet()) {
//拼接
stringBuilder.append(entry.getKey())
.append("=")
.append(entry.getValue())
.append("&");
}
//删掉最后一个&符号
if (stringBuilder.indexOf("&") != -1){
stringBuilder.deleteCharAt(stringBuilder.lastIndexOf("&"));
}
String newUrl = stringBuilder.toString();//新的路径
//拿着新的路径重新构建请求
request = request.newBuilder()
.url(newUrl)
.build();
}else if ("POST".equals(method)){
//先获取到老的请求的实体内容
RequestBody oldRequestBody = request.body();//....之前的请求参数,,,需要放到新的请求实体内容中去
//如果请求调用的是上面doPost方法
if (oldRequestBody instanceof FormBody){
FormBody oldBody = (FormBody) oldRequestBody;
//构建一个新的请求实体内容
FormBody.Builder builder = new FormBody.Builder();
//1.添加老的参数
for (int i=0;i<oldBody.size();i++){
builder.add(oldBody.name(i),oldBody.value(i));
}
//2.添加公共参数
for (Map.Entry<String,String> entry:map.entrySet()) {
builder.add(entry.getKey(),entry.getValue());
}
FormBody newBody = builder.build();//新的请求实体内容
//构建一个新的请求
request = request.newBuilder()
.url(oldUrl)
.post(newBody)
.build();
}
}
Response response = chain.proceed(request);
return response;
}
})
.build();
//使全局就一个Retrofit对象,设置基础Url
public static ApiService apiService = new Retrofit.Builder()
.baseUrl("http://qbh.2dyt.com")
//使我们能高度自定义转化器
.addConverterFactory(ScalarsConverterFactory.create())
.client(okHttpClient)
//把 以前的 call 转化成 Observable,这是Retrofit与RxJava结合使用的关键
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build().create(ApiService.class);
public static Observable<String> get(String url) {
return apiService.get(url)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public static Observable<String> get(String url, Map<String, String> map) {
return apiService.get(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public static Observable<String> post(String url, Map<String, String> map) {
return apiService.post(url, map)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
Utils
public class Utils {
private StringBuilder mFormatBuilder;
private Formatter mFormatter;
public Utils(){
//转换成字符串的时间
mFormatBuilder = new StringBuilder();
mFormatter = new Formatter(mFormatBuilder, Locale.getDefault());
}
/**
* 把毫秒转换成:1:20:30这样的形式
* @param timeMs
* @return
*/
public String stringForTime(int timeMs){
int totalSeconds = timeMs/1000;
int seconds = totalSeconds % 60;
int minutes = (totalSeconds/60)%60;
int hours = totalSeconds/3600;
mFormatBuilder.setLength(0);
if(hours>0){
return mFormatter.format("%d:%02d:%02d",hours,minutes,seconds).toString();
} else {
return mFormatter.format("%02d:%02d",minutes,seconds).toString();
}
}
}
MyExpandableAdapter
public class MyExpandableAdapter extends BaseExpandableListAdapter {
private SelectShopping_P selectShopping_p;
private Handler handler;
private Context context;
private MyCarDataBean selectShopping_bean;
private int childIndex;
private int allIndex;
public MyExpandableAdapter(Context context, MyCarDataBean selectShopping_bean, Handler handler, SelectShopping_P selectShopping_p) {
this.context = context;
this.selectShopping_bean = selectShopping_bean;
this.handler = handler;
this.selectShopping_p = selectShopping_p;
}
@Override
public int getGroupCount() {
return selectShopping_bean.getData().size();
}
@Override
public int getChildrenCount(int i) {
return selectShopping_bean.getData().get(i).getList().size();
}
@Override
public Object getGroup(int i) {
return selectShopping_bean.getData().get(i);
}
@Override
public Object getChild(int i, int i1) {
return selectShopping_bean.getData().get(i).getList().get(i1);
}
@Override
public long getGroupId(int i) {
return i;
}
@Override
public long getChildId(int i, int i1) {
return i1;
}
@Override
public boolean hasStableIds() {
return true;
}
// 优化
@Override
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) {
final groupVH holder;
if (view == null) {
view = View.inflate(context, R.layout.group_layout, null);
holder = new groupVH();
holder.group_check = view.findViewById(R.id.group_check);
holder.group_name = view.findViewById(R.id.group_name);
view.setTag(holder);
} else {
holder = (groupVH) view.getTag();
}
final MyCarDataBean.DataBean dataBean = selectShopping_bean.getData().get(i);
//赋值
holder.group_check.setChecked(dataBean.isGroup_checked());
holder.group_name.setText(dataBean.getSellerName());
holder.group_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//让当前的所有二级列表随我变化
childIndex = 0;
//更新
updateChildCheckedInGroup(holder.group_check.isChecked(),dataBean);
}
});
return view;
}
//让所有的二级列表都随着当前的一级列表变化
private void updateChildCheckedInGroup(final boolean checked, final MyCarDataBean.DataBean dataBean) {
final MyCarDataBean.DataBean.ListBean listBean = dataBean.getList().get(childIndex);
Map<String, String> params = new HashMap<>();
params.put("uid","71");
params.put("sellerid", String.valueOf(listBean.getSellerid()));
params.put("pid", String.valueOf(listBean.getPid()));
params.put("selected", String.valueOf(checked ? 1:0));
params.put("num", String.valueOf(listBean.getNum()));
OkHttp3Util.doPost(My_api.ShoppingUpdata, params, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
childIndex++;
if(childIndex<dataBean.getList().size()){
updateChildCheckedInGroup(checked,dataBean);
}else{
//购物车
selectShopping_p.getdata(My_api.goShopping);
}
}
}
});
}
//在这里加载二级列表 优化
@Override
public View getChildView(final int i, int i1, boolean b, View view, ViewGroup viewGroup) {
childVH holder;
if (view == null) {
view = View.inflate(context, R.layout.child_layout, null);
holder = new childVH();
holder.child_check = view.findViewById(R.id.child_check);
holder.child_image = view.findViewById(R.id.child_image);
holder.content = view.findViewById(R.id.content);
holder.price = view.findViewById(R.id.price);
holder.jia = view.findViewById(R.id.jia);
holder.count = view.findViewById(R.id.count);
holder.jian = view.findViewById(R.id.jian);
view.setTag(holder);
} else {
holder = (childVH) view.getTag();
}
final MyCarDataBean.DataBean.ListBean listBean = selectShopping_bean.getData().get(i).getList().get(i1);
//赋值
holder.child_check.setChecked(listBean.getSelected()==0?false:true);
String[] split = listBean.getImages().split("\\|");
Glide.with(context).load(split[0]).into(holder.child_image);
holder.content.setText(listBean.getTitle());
holder.price.setText(listBean.getBargainPrice()+"");
holder.count.setText(listBean.getNum()+"");
//当我点击二级列表的单选框的时候
holder.child_check.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//当我点击二级列表的单选框的时候更新接口,重新访问数据
HashMap<String, String> map = new HashMap<>();
map.put("uid","71");
map.put("sellerid",listBean.getSellerid()+"");
map.put("pid",listBean.getPid()+"");
map.put("num",listBean.getNum()+"");
map.put("selected", String.valueOf(listBean.getSelected()==0?1:0));
OkHttp3Util.doPost(My_api.ShoppingUpdata, map, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//在重新获取数据展示
selectShopping_p.getdata(My_api.goShopping);
}
});
}
});
//加号
holder.jia.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//请求更新购物车接口
Map<String, String> params = new HashMap<>();
params.put("uid","71");
params.put("sellerid", String.valueOf(listBean.getSellerid()));
params.put("pid", String.valueOf(listBean.getPid()));
params.put("selected", String.valueOf(listBean.getSelected()));//listBean.getSelected()...0--->1,,,1--->0
params.put("num", String.valueOf(listBean.getNum() +1 ));
OkHttp3Util.doPost(My_api.ShoppingUpdata, params, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
selectShopping_p.getdata(My_api.goShopping);
}
}
});
}
});
//减号
holder.jian.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Map<String, String> params = new HashMap<>();
params.put("uid","71");
params.put("sellerid", String.valueOf(listBean.getSellerid()));
params.put("pid", String.valueOf(listBean.getPid()));
params.put("selected", String.valueOf(listBean.getSelected()));//listBean.getSelected()...0--->1,,,1--->0
params.put("num", String.valueOf(listBean.getNum() -1 ));
OkHttp3Util.doPost(My_api.ShoppingUpdata, params, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
selectShopping_p.getdata(My_api.goShopping);
}
}
});
}
});
return view;
}
@Override
public boolean isChildSelectable(int i, int i1) {
return true;
}
//实现全选框,根据传过来的当前全选框的状态
public void setAllChildChecked(boolean checked) {
//通过遍历,把所有的孩子装到一个大的集合中
List<MyCarDataBean.DataBean.ListBean> allList = new ArrayList<>();
for (int i=0;i<selectShopping_bean.getData().size();i++){
for (int j = 0;j<selectShopping_bean.getData().get(i).getList().size();j++){
allList.add(selectShopping_bean.getData().get(i).getList().get(j));
}
}
//更新每一个子孩子的状态...递归
allIndex = 0;
updateAllChild(checked,allList);
}
private void updateAllChild(final boolean checked, final List<MyCarDataBean.DataBean.ListBean> allList) {
//得到每一个子孩子
MyCarDataBean.DataBean.ListBean listBean = allList.get(allIndex);
//更新
HashMap<String, String> map = new HashMap<>();
map.put("uid","71");
map.put("sellerid",listBean.getSellerid()+"");
map.put("pid",listBean.getPid()+"");
map.put("num",listBean.getNum()+"");
map.put("selected", String.valueOf(checked ?1:0));
OkHttp3Util.doPost(My_api.ShoppingUpdata, map, new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if(response.isSuccessful()){
allIndex++;
if(allIndex<allList.size()){
updateAllChild(checked,allList);
}else{
//查询购物车
selectShopping_p.getdata(My_api.goShopping);
}
}
}
});
}
//计算商品价格 和 数量
public void sendPriceAndCount() {
//先定义两个变量
double price = 0;
int count = 0;
//找到所有的一级列表
for (int i=0;i<selectShopping_bean.getData().size();i++){
//当前一级列表有集合,然后找到每个二级列表
List<MyCarDataBean.DataBean.ListBean> listBeans = selectShopping_bean.getData().get(i).getList();
for (int j = 0; j< listBeans.size(); j++){
//这个是当前的二级列表
MyCarDataBean.DataBean.ListBean listBean = listBeans.get(j);
//选中的时候计算价格和数量 如果这个二级列表是选中的状态
if (listBean.getSelected() == 1){
//计算价钱 数量
price += listBean.getBargainPrice() * listBean.getNum();
count += listBean.getNum();
}
}
}
//目的是为了让价钱更精准一些
DecimalFormat decimalFormat = new DecimalFormat("0.00");
String priceString = decimalFormat.format(price);
//封装一下
CountPriceBean countPriceBean = new CountPriceBean(priceString, count);
//发送给activity/fragment进行显示
Message msg = Message.obtain();
msg.what = 0;
msg.obj = countPriceBean;
handler.sendMessage(msg);
}
class groupVH {
CheckBox group_check;
TextView group_name;
}
class childVH {
CheckBox child_check;
ImageView child_image;
TextView content;
TextView price;
TextView jia;
TextView count;
TextView jian;
}
}
PlayingMusicServices
public class PlayingMusicServices extends Service {
//用于播放音乐等媒体资源
private MediaPlayer mediaPlayer;
//标志判断播放歌曲是否是停止之后重新播放,还是继续播放
private boolean isStop=true;
/**
* onBind,返回一个IBinder,可以与Activity交互
* 这是Bind Service的生命周期方法
* @param intent
* @return
*/
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
//在此方法中服务被创建
@Override
public void onCreate() {
super.onCreate();
if (mediaPlayer==null){
mediaPlayer=new MediaPlayer();
//为播放器添加播放完成时的监听器
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
//发送广播到MainActivity
Intent intent=new Intent();
intent.setAction("com.complete");
sendBroadcast(intent);
}
});
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
switch (intent.getIntExtra("type",-1)){
case MusicActivity.PLAT_MUSIC:
if (isStop){
//重置mediaplayer
mediaPlayer.reset();
//将需要播放的资源与之绑定
mediaPlayer=MediaPlayer.create(this, R.raw.gdaqgs);
//开始播放
mediaPlayer.start();
//是否循环播放
mediaPlayer.setLooping(false);
isStop=false;
}else if (!isStop&&mediaPlayer.isPlaying()&&mediaPlayer!=null){
mediaPlayer.start();
}
break;
case MusicActivity.PAUSE_MUSIC:
//播放器不为空,并且正在播放
if (mediaPlayer!=null&&mediaPlayer.isPlaying()){
mediaPlayer.pause();
}
break;
case MusicActivity.STOP_MUSIC:
if (mediaPlayer!=null){
//停止之后要开始播放音乐
mediaPlayer.stop();
isStop=true;
}
break;
}
return START_NOT_STICKY;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}