工具类

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();
    }
}







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值