日志封装类-mylog
是对android log的封装,封装后 可以设置显示级别
/** * log的封装类,方便开启和关闭log */ public class mylog { public static final int verbose = 1; public static final int debug = 2; public static final int info = 3; public static final int warn = 4; public static final int error = 5; public static final int nothing = 6; public static final int level = verbose; //设置显示级别 public static final string mylog_path_sdcard_dir = "/sdcard/scanzbar/log";// 日志文件在sdcard中的路径 public static final string my_log_file_name = "log.txt";// 本类输出的日志文件名称 public static void v(string tag, string msg){ if(level <= verbose) log.v(tag,msg); } public static void d(string tag, string msg){ if(level <= debug) log.d(tag,msg); } public static void i(string tag, string msg){ if(level <= info) log.i(tag,msg); } public static void w(string tag, string msg){ if(level <= warn) log.w(tag,msg); } public static void e(string tag, string msg){ if(level <= error) log.e(tag,msg); } //调用该方法,可以将日志写入日志文件 public static void loge(string tag, string msg){ if(level <= error) { log.e(tag, msg); writelogtofile("error",tag,msg); } } /** * 打开日志文件并写入日志 * @param mylogtype * @param tag * @param text */ private static void writelogtofile(string mylogtype, string tag, string text) {// 新建或打开日志文件 date nowtime = new date(); string needwritefiel = new simpledateformat(timeutil.sdf3).format(nowtime); string needwritemessage = new simpledateformat(timeutil.sdf1).format(nowtime) + " " + mylogtype + " " + tag + " " + text; file dirpath = environment.getexternalstoragedirectory(); file dirsfile = new file(mylog_path_sdcard_dir); if (!dirsfile.exists()){ dirsfile.mkdirs(); } //创建日志文件 file file = new file(dirsfile.tostring(), needwritefiel +".txt");// mylog_path_sdcard_dir if (!file.exists()) { try { //在指定的文件夹中创建文件 boolean creatb = file.createnewfile(); if(!creatb) mylog.e("mylog","创建日志文件失败!"); } catch (exception e) { e.printstacktrace(); } } try(filewriter filerwriter = new filewriter(file, true);// 后面这个参数代表是不是要接上文件中原来的数据,不进行覆盖 bufferedwriter bufwriter = new bufferedwriter(filerwriter)) { bufwriter.write(needwritemessage); bufwriter.newline(); } catch (ioexception e) { e.printstacktrace(); } } }
使用使用和正常log使用一样
mylog.e("mylog","123"); mylog.i("mylog","222"); ...
线程封装类-localthreadpools
针对asynctask被弃用的替代
/** * @description todo(全局使用的线程池) */ public class localthreadpools { private static int threadnum = 0; private static string tag = localthreadpools.class.getsimplename(); private static executorservice thread_pool_executor; /** * cpu数量 */ private static final int cpu_count = runtime.getruntime().availableprocessors(); /** * 线程池数量 */ private static final int core_pool_size = math.max(2, math.min(cpu_count-1,4)); /** * 最大线程数量 = cpu数量*2+1 */ private static final int maximum_pool_size = cpu_count * 2+1; /** * 等待线程存活时间 */ private static final int keep_alive_seconds = 60; /** * 等待线程存活时间的单位 */ private static final timeunit unit = timeunit.minutes; private static final blockingqueue<runnable> spoolworkqueue = new linkedblockingqueue<>(8); /** * 线程工厂 */ private static final threadfactory sthreadfactory = new threadfactory() { private final atomicinteger mcount = new atomicinteger(1); public thread newthread(runnable r) { threadnum++; mylog.e("mylog","线程工厂创建一个线程:"+threadnum+","+mcount.getandincrement()); return new thread(r, "mangotask #" + mcount.getandincrement()); } }; private void initthreadpool() { mylog.e("mylog","core_pool_size:"+core_pool_size+",maximum_pool_size:"+maximum_pool_size+"," + "keep_alive_seconds:"+keep_alive_seconds+","); threadpoolexecutor threadpoolexecutor = new threadpoolexecutor( core_pool_size, maximum_pool_size, keep_alive_seconds, unit, spoolworkqueue, sthreadfactory,new rejectedhandler()){ @override public void execute(runnable command) { super.execute(command); mylog.e("mylog","-----------activecount="+getactivecount()); mylog.e("mylog","-----------poolsize="+getpoolsize()); mylog.e("mylog","-----------queue="+getqueue().size()); mylog.e("mylog","-----------finish="+getcompletedtaskcount()); } }; //允许核心线程空闲超时时被回收 threadpoolexecutor.allowcorethreadtimeout(true); thread_pool_executor = threadpoolexecutor; } private class rejectedhandler implements rejectedexecutionhandler { @override public void rejectedexecution(runnable r, threadpoolexecutor executor) { //可在这里做一些提示用户的操作 tools.showtoast(mcontext.get(),"当前执行的任务过多,请稍后再试"); } } private weakreference<context> mcontext; private static localthreadpools instance; private localthreadpools(context context){ mcontext = new weakreference<>(context); initthreadpool(); } public static localthreadpools getinstance(context context){ if (instance == null) { instance = new localthreadpools(context); } return instance; } public void execute(runnable command){ thread_pool_executor.execute(command); } /** * 通过interrupt方法尝试停止正在执行的任务,但是不保证真的终止正在执行的任务 * 停止队列中处于等待的任务的执行 * 不再接收新的任务 * @return 等待执行的任务列表 */ public static list<runnable> shutdownnow(){ return thread_pool_executor.shutdownnow(); } /** * 停止队列中处于等待的任务 * 不再接收新的任务 * 已经执行的任务会继续执行 * 如果任务已经执行完了没有必要再调用这个方法 */ public void shutdown(){ thread_pool_executor.shutdown(); spoolworkqueue.clear(); } }
使用
localthreadpools.getinstance((testactivity) mview).execute(new runnable() { @override public void run() { //异步操作 } });
自定义进度条-loadprogressbar
自定义进度条
/** * 进度条 */ public class downloadprogressbar extends view { private paint paint = new paint(); // 绘制背景灰色线条画笔 private paint painttext = new paint(); // 绘制下载进度画笔 private float offset = 0f; // 下载偏移量 private float maxvalue = 0f; // 进度的总大小 private float currentvalue = 0f; // 当前进度 private rect mbound = new rect(); // 获取百分比数字的长宽 private string percentvalue = "0%"; // 要显示的现在百分比 private float offsetright = 0f; // 灰色线条距离右边的距离 private int textsize = sizeutils.sp2px(25); // 百分比的文字大小 private float offsettop = sizeutils.dp2px(18); // 距离顶部的偏移量 public downloadprogressbar(context context) { this(context, null); } public downloadprogressbar(context context, @nullable attributeset attrs) { this(context, attrs, 0); } public downloadprogressbar(context context, @nullable attributeset attrs, int defstyleattr) { super(context, attrs, defstyleattr); gettextwidth(); } @override protected void ondraw(canvas canvas) { super.ondraw(canvas); // 绘制底色 paint.setcolor(color.parsecolor("#eeeeee")); paint.setstrokewidth(sizeutils.dp2px(10)); canvas.drawline(0, offsettop, getwidth() - offsetright, offsettop, paint); // 绘制进度条颜色 paint.setcolor(color.parsecolor("#ff0000")); paint.setstrokewidth(sizeutils.dp2px(11)); canvas.drawline(0, offsettop, offset, offsettop, paint); paint.setcolor(color.parsecolor("#ffffff")); paint.setstrokewidth(sizeutils.dp2px(1)); painttext.setcolor(color.parsecolor("#ffffff")); painttext.settextsize(textsize); painttext.setantialias(true); painttext.gettextbounds(percentvalue, 0, percentvalue.length(), mbound); canvas.drawline(offset, offsettop, offset + mbound.width() + sizeutils.dp2px(4), offsettop, paint); canvas.drawtext(percentvalue, offset, offsettop + mbound.height() / 2 - sizeutils.dp2px(2), painttext); } public void setcurrentvalue(float currentvalue) { this.currentvalue = currentvalue; int value = (int) (currentvalue * 100 / maxvalue); if (value < 100 && value > 0) { percentvalue = value + "%"; } else if (value <= 0) { percentvalue = "0%"; } else { percentvalue = "100%"; } calc(); invalidate(); } private void calc() { if (currentvalue < maxvalue) { offset = (getwidth() - offsetright) * currentvalue / maxvalue; } else { offset = getwidth() - offsetright; } } /** * 设置最大值 * * @param maxvalue */ public void setmaxvalue(int maxvalue) { this.maxvalue = maxvalue; } /** * 获取“100%”的宽度 */ public void gettextwidth() { paint paint = new paint(); rect rect = new rect(); paint.settextsize(textsize); paint.setantialias(true); paint.gettextbounds("100%", 0, "100%".length(), rect); offsetright = rect.width() + sizeutils.dp2px(5);; } }
解压缩类-ziputils
解压缩
/** * 解压缩zip文件 */ public class ziputils { public ziputils() { } /** * 根据byte数组,生成文件 */ public static void getfile(byte[] bfile, string filepath, string filename) { bufferedoutputstream bos = null; fileoutputstream fos = null; file file = null; try { file dir = new file(filepath); if (!dir.exists()) {//判断文件目录是否存在 dir.mkdirs(); } file = new file(filepath + filename); fos = new fileoutputstream(file); bos = new bufferedoutputstream(fos); bos.write(bfile); } catch (exception e) { e.printstacktrace(); } finally { if (bos != null) { try { bos.close(); } catch (ioexception e1) { e1.printstacktrace(); } } if (fos != null) { try { fos.close(); } catch (ioexception e1) { e1.printstacktrace(); } } } } // 使用密码解压(图片不加密) public static boolean unzipfile1(string zipfilefullname, string filepath, string password) { try { zipfile zipfile = new zipfile(zipfilefullname); // 如果解压需要密码 if (zipfile.isencrypted()) { zipfile.setpassword(password); } file file = new file(filepath); if (!file.getparentfile().exists()) { file.getparentfile().mkdirs(); } zipfile.extractall(filepath);//提取所有文件 return true; } catch (exception e) { e.printstacktrace(); return false; } } // 使用密码解压 public static boolean unzipfile(string zipfilefullname, string filepath, string password) { try { zipfile zipfile = new zipfile(zipfilefullname); // 如果解压需要密码 if (zipfile.isencrypted()) { zipfile.setpassword(password); } file file = new file(filepath); if (!file.getparentfile().exists()) { file.getparentfile().mkdirs(); } zipfile.extractall(filepath);//提取所有文件 // 压缩 zipfolder(filepath, filepath + "01"); // 解压 ziputils.unzipfolder(filepath + "01", filepath); return true; } catch (exception e) { e.printstacktrace(); return false; } } /** * 解压zip到指定的路径 * * @param zipfilestring zip的名称 * @param outpathstring 要解压缩路径 * @throws exception */ public static void unzipfolder(string zipfilestring, string outpathstring) { zipinputstream inzip = null; outputstream out = null; try{ inzip = new zipinputstream(new fileinputstream(zipfilestring)); zipentry zipentry; string szname = ""; list<file> filelist = new arraylist<file>(); while ((zipentry = inzip.getnextentry()) != null) { szname = zipentry.getname(); if (zipentry.isdirectory()) { //获取部件的文件夹名 szname = szname.substring(0, szname.length() - 1); file folder = new file(outpathstring + file.separator + szname); folder.mkdirs(); } else { file file = new file(outpathstring + file.separator + szname); if (!file.exists()) { filelist.add(file); file.getparentfile().mkdirs(); file.createnewfile(); } // 获取文件的输出流 // fileoutputstream out = new fileoutputstream(file); out = aesutil.encrypt(file, aesutil.tokey(myapplication.getinstance().getaeskey().getbytes()));// 加密 int len; byte[] buffer = new byte[1024]; // 读取(字节)字节到缓冲区 while ((len = inzip.read(buffer)) != -1) { // 从缓冲区(0)位置写入(字节)字节 out.write(buffer, 0, len); out.flush(); } out.close(); } } inzip.close(); // 删除目录下多余文件夹 file dirfile = new file(outpathstring); file[] files = dirfile.listfiles(); for (int i = 0; i < files.length; i++) { if (files[i].isdirectory()) { deletedirectory(files[i].getabsolutepath()); } } }catch (exception e){ e.printstacktrace(); }finally { if(inzip != null){ safeclose(inzip); } if(out != null){ safeclose(out); } } } public static void safeclose(outputstream fis){ if(fis != null){ try{ fis.close(); }catch (ioexception e){ e.printstacktrace(); } } } public static void safeclose(zipinputstream fis){ if(fis != null){ try{ fis.close(); }catch (ioexception e){ e.printstacktrace(); } } } /** * 压缩文件和文件夹 * * @param srcfilestring 要压缩的文件或文件夹 * @param zipfilestring 解压完成的zip路径 * @throws exception */ public static void zipfolder(string srcfilestring, string zipfilestring) { fileoutputstream fis = null; zipoutputstream outzip = null; try{ fis = new fileoutputstream(zipfilestring); //创建zip outzip = new zipoutputstream(fis); //创建文件 file file = new file(srcfilestring); //压缩 zipfiles(file.getparent() + file.separator, file.getname(), outzip); //完成和关闭 outzip.finish(); outzip.close(); fis.close(); }catch (exception e){ e.printstacktrace(); }finally { if(fis != null){ safeclose(fis); } if(outzip != null){ safeclose1(outzip); } } } public static void safeclose(fileoutputstream fis){ if(fis != null){ try { fis.close(); } catch (ioexception e) { e.printstacktrace(); } } } public static void safeclose1(zipoutputstream fis){ if(fis != null){ try { fis.close(); } catch (ioexception e) { e.printstacktrace(); } } } /** * 压缩文件 * * @param folderstring * @param filestring * @param zipoutputsteam * @throws exception */ private static void zipfiles(string folderstring, string filestring, zipoutputstream zipoutputsteam) { fileinputstream inputstream = null; try{ if (zipoutputsteam == null) return; file file = new file(folderstring + filestring); if (file.isfile()) { zipentry zipentry = new zipentry(filestring); inputstream = new fileinputstream(file); zipoutputsteam.putnextentry(zipentry); int len; byte[] buffer = new byte[4096]; while ((len = inputstream.read(buffer)) != -1) { zipoutputsteam.write(buffer, 0, len); } zipoutputsteam.closeentry(); } else { //文件夹 string filelist[] = file.list(); //没有子文件和压缩 if (filelist.length <= 0) { zipentry zipentry = new zipentry(filestring + file.separator); zipoutputsteam.putnextentry(zipentry); zipoutputsteam.closeentry(); } //子文件和递归 for (int i = 0; i < filelist.length; i++) { zipfiles(folderstring + filestring + "/", filelist[i], zipoutputsteam); } } }catch (exception e){ e.printstacktrace(); }finally { if(inputstream != null){ safeclose(inputstream); } } } public static bitmap getbitmap(file photofile) { inputstream fis = null; try { fis = aesutil.decrypt(photofile, aesutil.tokey(myapplication.getinstance().getaeskey().getbytes())); return bitmapfactory.decodestream(fis); ///把流转化为bitmap图片 } catch (filenotfoundexception e) { e.printstacktrace(); mylog.e("mylog", "e1:" + e.getmessage()); return null; } catch (exception e) { e.printstacktrace(); mylog.e("mylog", "e2:" + e.getmessage()); return null; } finally { if(fis != null){ safeclose(fis); } } } public static void safeclose(inputstream fis){ if(fis != null){ try{ fis.close(); }catch (ioexception e){ e.printstacktrace(); } } } public static file getphotofile(string nonet, string fileabsolutepath) { file file = new file(fileabsolutepath); file[] subfile = file.listfiles(); if (subfile != null) { for (int i = 0; i < subfile.length; i++) { // 判断是否为文件夹 /*if (subfile[i].isdirectory()) { getphotofile(idnonet, subfile[i].getabsolutepath()); } else {*/ string filename = subfile[i].getname(); if (!textutils.isempty(filename) && filename.length() >= 13 && nonet != null) { string subfilename = filename.substring(filename.length() - 13, filename.length() - 4); // mylog.e("mylog", "subfilename:" + subfilename + " nonet:" + nonet); if (subfilename.equals(nonet)) { mylog.e("mylog", "filename:" + filename); return subfile[i]; } } } } return null; } /** * @param zipname 压缩文件的路径 * @param filepath 被压缩文件的路径 * @param password 加密 * @description:压缩以及加密 * @author: renbo * @date: 2021年5月19日 下午3:35:33 */ public static void unzippass(string zipname, string filepath, string password) throws zipexception { zipfile zipfile = new zipfile(zipname); arraylist<file> filestoadd = new arraylist<file>(); file root = new file(filepath); file[] files = root.listfiles(); for (file file : files) { if (file.isdirectory()) { filestoadd.add(new file(file.getabsolutepath())); } else { filestoadd.add(new file(file.getabsolutepath())); } } zipparameters parameters = new zipparameters(); parameters.setcompressionmethod(zip4jconstants.comp_deflate); // set parameters.setcompressionlevel(zip4jconstants.deflate_level_normal); parameters.setencryptfiles(true); parameters.setencryptionmethod(zip4jconstants.enc_method_aes); parameters.setaeskeystrength(zip4jconstants.aes_strength_256); // set password parameters.setpassword(password); zipfile.addfiles(filestoadd, parameters); } /** * 删除单个文件 * * @param filepath 被删除文件的文件名 * @return 文件删除成功返回true,否则返回false */ public static boolean deletefile(string filepath) { file file = new file(filepath); if (file.isfile() && file.exists()) { return file.delete(); } return false; } /** * 删除文件夹以及目录下的文件 * * @param filepath 被删除目录的文件路径 * @return 目录删除成功返回true,否则返回false */ public static boolean deletedirectory(string filepath) { boolean flag = false; //如果filepath不以文件分隔符结尾,自动添加文件分隔符 if (!filepath.endswith(file.separator)) { filepath = filepath + file.separator; } file dirfile = new file(filepath); if (!dirfile.exists() || !dirfile.isdirectory()) { return false; } flag = true; file[] files = dirfile.listfiles(); //遍历删除文件夹下的所有文件(包括子目录) for (int i = 0; i < files.length; i++) { if (files[i].isfile()) { //删除子文件 flag = deletefile(files[i].getabsolutepath()); if (!flag) break; } else { //删除子目录 flag = deletedirectory(files[i].getabsolutepath()); if (!flag) break; } } if (!flag) return false; //删除当前空目录 return dirfile.delete(); } /** * 根据路径删除指定的目录或文件,无论存在与否 * * @param filepath 要删除的目录或文件 * @return 删除成功返回 true,否则返回 false。 */ public static boolean deletefolder(string filepath) { file file = new file(filepath); if (!file.exists()) { return false; } else { if (file.isfile()) { // 为文件时调用删除文件方法 return deletefile(filepath); } else { // 为目录时调用删除目录方法 return deletedirectory(filepath); } } } }
本地数据库类-mysqlitehelper
android 创建本地数据库
/** * 数据库帮助类 */ public class mysqlitehelper extends sqliteopenhelper { private static string initsqlfile = environment.getexternalstoragedirectory().getabsolutepath(); private static string realpath = initsqlfile+ file.separator+"xxxx"; //需要创建的路径 private static string realfile = realpath + file.separator +"xxxx.db"; //需要创建的文件 private static mysqlitehelper db; private static final int datebase_version = 1; //定义版本号 public static string getrealpath(){ return realpath; } public static string getrealfile(){ return realfile; } public static void closedb(){ db.close(); } //自定义构造方法,简化自动生成的构造方法,path 是主要指定创建db文件的路径 public mysqlitehelper(context context){ this(context,realfile,null,datebase_version); mylog.e("mylog","文件路径:"+realfile); } //实现接口必须实现的构造方法 public mysqlitehelper(context context, string name, sqlitedatabase.cursorfactory factory, int version){ super(context, name, factory, version); } @override public void oncreate(sqlitedatabase sqlitedatabase) { //第一次创建数据库时,才会调用 mylog.e("mylog","创建数据库"); sqlitedatabase.execsql(tablea.creat_table(tablea.table_name())); //创建表 sqlitedatabase.execsql(tableb.creat_table(tableb.table_name())); //创建表 } @override public void onupgrade(sqlitedatabase sqlitedatabase, int i, int i1) { } }
tablea对于的类
/** * 对应数据表的类 */ public class tablea { public static string table_name(){ return "table_a"; } public static final string id = "id"; //id public static final string s1= "s1";//字段s1 public static final string s1= "s2";//字段s2 public static final string s1= "s3";//字段s3 public static final string s1= "s4";//字段s4 public static final string s1= "s5";//字段s5 public static final string s1= "s6";//字段s6 public static string creat_table(string tablename){ return new stringbuffer(). append("create table if not exists ").append(tablename). append("("). append(id).append(" integer primary key autoincrement,"). append(s1).append(" text,"). append(s2).append(" text,"). append(s3).append(" text,"). append(s4).append(" text,"). append(s5).append(" text,"). append(s6).append(" text"). append(");").tostring(); } }
访问webservice封装-httputils
对访问webservice 接口的请求封装
引入的包
implementation files('libs\\ksoap2-android-assembly-3.3.0-jar-with-dependencies.jar')
代码
import org.ksoap2.serialization.soapobject; import org.ksoap2.serialization.soapserializationenvelope; import org.ksoap2.transport.httptransportse; import org.xmlpull.v1.xmlpullparserexception; import java.io.ioexception; import java.util.base64; public class httputils { private static final string servicenamesapce = "http://webservice.cps.xxx.com/"; private static myapplication myapplication = myapplication.getinstance(); private httputils() { } // 登录 public static string login(string methodname, string username, string password,string pingid) { soapobject request = new soapobject(servicenamesapce, methodname); request.addproperty("username", jiami(username)); request.addproperty("password", jiami(password)); request.addproperty("pingid",jiami(pingid)); request.addproperty("pingidly",null); return scop(request); } private static string scop(soapobject request) { //创建soapserializationenvelope 对象,同时指定soap版本号 soapserializationenvelope envelope = new soapserializationenvelope(soapserializationenvelope.ver10); envelope.bodyout = request;//由于是发送请求,所以是设置bodyout envelope.dotnet = false;//由于是.net开发的webservice envelope.setoutputsoapobject(request); httptransportse httptransportse = new httptransportse(geturl(), 400000); try { httptransportse.call(null, envelope);//调用 } catch (ioexception e) { e.printstacktrace(); return "{\"error\":\"" + e.getmessage() + "\"}"; } catch (xmlpullparserexception e) { e.printstacktrace(); return "{\"error\":\"" + e.getmessage() + "\"}"; } // 获取返回的数据 soapobject object = (soapobject) envelope.bodyin; return object.getproperty(0).tostring(); } public static string jiami(string str) { //加密 return aesutil.aesencrypt(str, myapplication.getinstance().getaeskey()); } public static string jiemi(string str){ //解密 return aesutil.aesdecrypt(str,myapplication.getinstance().getaeskey()); } public static string geturl(){ return myapplication.getip()+myapplication.getip_suffix(); } }
toolbar封装类-materialtoolbar
布局文件
<com.google.android.material.appbar.materialtoolbar android:theme="@style/themeoverlay.appcompat.dark.actionbar" android:id="@+id/titlebar" android:background="@color/primary1" style="@style/widget.materialcomponents.toolbar.surface" app:layout_constrainttop_totopof="parent" app:layout_constraintleft_toleftof="parent" app:layout_constraintright_torightof="parent" android:layout_width="match_parent" android:layout_height="wrap_content" app:navigationicon="@mipmap/back" app:title="xxxx" app:titletextcolor="@color/white" app:titlecentered="true" app:titletextappearance="@style/text18wb" app:subtitle="xxxx年xx月xx日 星期x" app:subtitletextcolor="@color/white" app:subtitlecentered="true" app:subtitletextappearance="@style/text12w" app:menu="@menu/scan_menu"/>
配置文件
1、input_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!--showasaction的值always一直显示,ifroom如果有地方就显示,没有则隐藏,never一直隐藏--> <item android:id="@+id/owner" android:title="个人中心" android:icon="@mipmap/owner1" app:showasaction="always"/> </menu>
2、scan_menu.xml
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <!--showasaction的值always一直显示,ifroom如果有地方就显示,没有则隐藏,never一直隐藏--> <item android:id="@+id/clean" android:title="一键清空" android:icon="@mipmap/clean1" app:showasaction="ifroom"/> <item android:id="@+id/input" android:title="行李补录" android:icon="@mipmap/shoudong" app:showasaction="ifroom"/> <!-- <item--> <!-- android:id="@+id/setting"--> <!-- android:title="setting"--> <!-- android:icon="@mipmap/ic_launcher"--> <!-- app:showasaction="never"/>--> </menu>
初始化
private void inittoolbar(){ flightinputbinding.titlebar.settitle("航班设置"); flightinputbinding.titlebar.setsubtitle(myapplication.getdate_week()); setsupportactionbar(flightinputbinding.titlebar); }
布局与按钮事件
@override public boolean oncreateoptionsmenu(menu menu) { getmenuinflater().inflate(r.menu.input_menu, menu); return super.oncreateoptionsmenu(menu); } @override public boolean onoptionsitemselected(@nonnull menuitem item) { int id = item.getitemid(); if(id == android.r.id.home){ dialog.showfinishdialog(this, "确定要退出app么?", () -> myapplication.finishallactivity()); }else if(id == r.id.owner){ intent i = new intent(flightinputactivity.this,infomationactivity.class); startactivityforresult(i,2001); } return super.onoptionsitemselected(item); }
网络请求框架-okgo
引入包
implementation 'com.lzy.net:okgo:3.0.4'
工具类
1、trustallcerts
此类用于绕过https验证
package com.kaiya.mvp.npm_ar.utils; import java.security.securerandom; import java.security.cert.certificateexception; import java.security.cert.x509certificate; import javax.net.ssl.hostnameverifier; import javax.net.ssl.sslcontext; import javax.net.ssl.sslsession; import javax.net.ssl.sslsocketfactory; import javax.net.ssl.trustmanager; import javax.net.ssl.x509trustmanager; /** * created by gang.qin * date:2024/3/19 15:05 * 质量、速度、廉价,选择其中两个 --- 匿名 */ //public class trustallcerts implements x509trustmanager { // @override // public void checkclienttrusted(x509certificate[] chain, string authtype) {} // // @override // public void checkservertrusted(x509certificate[] chain, string authtype) {} // // @override // public x509certificate[] getacceptedissuers() {return new x509certificate[0];} //} public class trustallcerts implements x509trustmanager { @override public void checkclienttrusted(x509certificate[] chain, string authtype) throws certificateexception { } @override public void checkservertrusted(x509certificate[] chain, string authtype) throws certificateexception { if (chain == null) { throw new illegalargumentexception(" check server x509certificates is null"); } } @override public x509certificate[] getacceptedissuers() { return new x509certificate[0]; } public static sslsocketfactory createsslsocketfactory() { sslsocketfactory ssffactory = null; try { sslcontext sc = sslcontext.getinstance("tls"); sc.init(null, new trustmanager[]{new trustallcerts()}, new securerandom()); ssffactory = sc.getsocketfactory(); } catch (exception e) { } return ssffactory; } public static class trustallhostnameverifier implements hostnameverifier { @override public boolean verify(string hostname, sslsession session) { return true; } } }
2、封装
package com.kaiya.mvp.npm_ar.utils; import android.app.application; import android.content.context; import android.transition.transitionmanager; import com.lzy.okgo.okgo; import com.lzy.okgo.cookie.cookiejarimpl; import com.lzy.okgo.cookie.store.memorycookiestore; import com.lzy.okgo.interceptor.httplogginginterceptor; import java.security.keymanagementexception; import java.security.nosuchalgorithmexception; import java.security.securerandom; import java.security.cert.certificateexception; import java.security.cert.x509certificate; import java.util.concurrent.timeunit; import java.util.logging.level; import javax.net.ssl.hostnameverifier; import javax.net.ssl.sslcontext; import javax.net.ssl.sslsession; import javax.net.ssl.trustmanager; import javax.net.ssl.x509trustmanager; import okhttp3.okhttpclient; /** * created by gang.qin * date:2024/3/20 15:41 * 质量、速度、廉价,选择其中两个 --- 匿名 */ public class okgoutils { public static x509trustmanager xtm; public static sslcontext sslcontext; public static void initokgo(application application){ xtm = new x509trustmanager() { @override public void checkclienttrusted(x509certificate[] x509certificates, string s) throws certificateexception { } @override public void checkservertrusted(x509certificate[] x509certificates, string s) throws certificateexception { } @override public x509certificate[] getacceptedissuers() { return new x509certificate[0]; } }; try { sslcontext = sslcontext.getinstance("ssl"); sslcontext.init(null, new trustmanager[]{xtm}, new securerandom()); } catch (nosuchalgorithmexception e) { e.printstacktrace(); } catch (keymanagementexception e) { e.printstacktrace(); } hostnameverifier do_not_verify = (hostname, session) -> true; // okgo.getinstance().init(this); //最简单的配置 什么都不需要写 全部使用默认参数 okhttpclient.builder builder = new okhttpclient.builder(); //可以使用okgo内置的log拦截器打印log,如果你觉得不好用,也可以自己写个,这个没有限制。 httplogginginterceptor logginginterceptor = new httplogginginterceptor("okgo"); //log打印级别 logginginterceptor.setprintlevel(httplogginginterceptor.level.body); //log颜色级别 logginginterceptor.setcolorlevel(level.all); builder.addinterceptor(logginginterceptor); //全局的读取超时时间 builder.readtimeout(okgo.default_milliseconds, timeunit.milliseconds); //全局的写入超时时间 builder.writetimeout(okgo.default_milliseconds, timeunit.milliseconds); //全局的连接超时时间 builder.connecttimeout(okgo.default_milliseconds, timeunit.milliseconds); /* * connecttimeout:指客户端和服务器 建立通道 的时间 writetimeout:客户端把数据写出去需要的时间 readtimeout:客户端等待服务器返回数据的时间 * */ //使用内存保持cookie,app退出后,cookie消失 builder.cookiejar(new cookiejarimpl(new memorycookiestore())); if(sslcontext != null){ builder.sslsocketfactory(sslcontext.getsocketfactory(),xtm) .hostnameverifier(do_not_verify) .build(); }else{ mylog.e("mylog","过滤器出错!"); } okgo.getinstance().init(application)//必须调用初始化 .setokhttpclient(builder.build()) //建议设置okhttpclient,不设置将使用默认的 .setretrycount(1); //超时重连,本身1次,我这边设置1次,总共2次访问 } public static okhttpclient initokhttp(){ okhttpclient client = new okhttpclient.builder() .sslsocketfactory(trustallcerts.createsslsocketfactory()) .hostnameverifier(new trustallcerts.trustallhostnameverifier()) .build(); return client; } }
post请求
private static void okgopost(string method, hashmap<string,string> hashmap, okgocallback callback){ okgo.<string>post(getip()+method) .params(hashmap) .execute(new stringcallback() { @override public void onsuccess(response<string> response) { callback.callback(response.body()); } }); }
下载
okgo.<file>get(uploadurl) .tag(this) //.headers("header1", "headervalue1")// //.params("param1", "paramvalue1")// .execute(new filecallback( savefilepath, savename ) { @override public void onstart(com.lzy.okgo.request.base.request<file, ? extends com.lzy.okgo.request.base.request> request) { super.onstart(request); mylog.e("mylog","开始下载"); } @override public void onsuccess(com.lzy.okgo.model.response<file> response) { progress.getprogress(100,"success"); } @override public void onerror(com.lzy.okgo.model.response<file> response) { super.onerror(response); progress.getprogress(-1,"下载出错!"); } @override public void downloadprogress(com.lzy.okgo.model.progress pp) { super.downloadprogress(pp); int ppi = (int)(pp.fraction * 100); mylog.e("mylog","progress:"+ppi); progress.getprogress(ppi,""); } });
网络请求框架-okhttp
引入包
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
封装
trustallcerts类 在okgo中 。
private static string okhttp(string method , string json){ mylog.e("mylog-url",getip()+method); okhttpclient client = new okhttpclient.builder() .sslsocketfactory(trustallcerts.createsslsocketfactory()) //绕过https .hostnameverifier(new trustallcerts.trustallhostnameverifier()) //绕过https .build(); requestbody body = requestbody.create(json, json); request request = new request.builder() .url( getip()+method ) .post(body) .build(); try{ response response = client.newcall(request).execute(); return objects.requirenonnull(response.body()).string(); }catch (exception e){ mylog.e("mylog","error:\r\n"+e.getmessage()); return "error:\r\n"+e.getmessage(); } }
调用
getlist list = new getlist(flightdate,flightno,sourceairport, myapplication.getappip()); //参数类 //list.tostring() 为 类转json字符串 string response = okhttp(get_list,list.tostring());
下载
/** * * @param uploadurl 下载路径 * @param savefilepath 保存路径 * @param savename 保存文件名 ,如 xxx.apk * @param progress 回调函数,获取下载进度 */ public void downloadapk(string uploadurl,string savefilepath,string savename,progress progress) { // 创建okhttpclient并配置自定义的trustmanager okhttpclient client = new okhttpclient.builder() .sslsocketfactory(trustallcerts.createsslsocketfactory()) .hostnameverifier(new trustallcerts.trustallhostnameverifier()) .build(); request request = new request.builder() .url(uploadurl) .build(); call call = client.newcall(request); call.enqueue(new callback() { @override public void onfailure(@notnull call call, @notnull ioexception e) { progress.getprogress(-1,e.getmessage()); } @override public void onresponse(@notnull call call, @notnull response response) throws ioexception { //3824043 long filemax = response.body().contentlength(); inputstream inputstream = objects.requirenonnull(response.body()).bytestream(); file target = new file(savefilepath,savename); fileoutputstream fileoutputstream = new fileoutputstream(target); try { byte[] buffer = new byte[2048]; int len; while ((len = inputstream.read(buffer)) != -1) { fileoutputstream.write(buffer, 0, len); int p = (int) ((target.length() * 100) / filemax); progress.getprogress(p,""); } fileoutputstream.flush(); } catch (ioexception e) { e.printstacktrace(); } } }); }
以上就是android封装常用工具类的示例详解的详细内容,更多关于android工具类的资料请关注代码网其它相关文章!
发表评论