### 第三方地图疑问
地图也是调用系统提供的接口吧。
有个疑问Fragment里面执行了activity.finish()的操作 之后,还能接着弹toast吗
有些UI交互还是觉得需要多学多看才懂
还有个疑问
最近在学自定义View,例如画个心型,根据上面的红框的坐标去画,这时我就有疑问
想开一个新的学习工程(在公司太闲了) 然后想到沙滩有公开API 放在postman先试试 图灵好了 登录这块是我请求错误了 md5摘要 这里显示的是密码错误吗 我拿我登录的密码去MD5后取32位小写放置 请求出结果错误
求大牛们指点一下呀
通过GLideModule 拦截client 在内部添加拦截器 下面是日志 以下是日志信息 日志有文本 可以看看我标识的 <-- 200 OK https://api.sunofbeaches.com/uc/ut/captcha?code=1641280445159 (132ms) // 获取验证码 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Server: nginx/1.21.4 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Date: Tue, 04 Jan 2022 07:15:00 GMT 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Content-Type: image/gif 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Transfer-Encoding: chunked 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Connection: keep-alive 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Pragma: No-cache 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Cache-Control: no-cache 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Expires: Thu, 01 Jan 1970 00:00:00 GMT 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: l_c_i: 927943204983013376 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Access-Control-Expose-Headers: l_c_i 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Access-Control-Allow-Headers: l_c_i 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-Content-Type-Options: nosniff 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-XSS-Protection: 1; mode=block 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-Frame-Options: DENY 01-04 15:14:05.435 15196-15225/com.lcq.st.sugarapp I/okhttp.OkHttpClient: <-- END HTTP (binary 3161-byte body omitted) 01-04 15:14:10.078 896-15252/? D/com.netease.nemu_vapi_android.thread.HttpServer: http server response data: {"errcode":0,"message":"OK","return":{"volume":0}} 01-04 15:14:18.849 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: --> POST https://api.sunofbeaches.com/uc/user/login/9tykg 01-04 15:14:18.849 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Content-Type: application/json; charset=UTF-8 01-04 15:14:18.849 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Content-Length: 72 01-04 15:14:18.849 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: l_c_i: 927943204983013376 // 获取的值 01-04 15:14:18.849 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: {"password":"8fb4158cbc09d35553039aaae2d8c605","phoneNum":"13602873056"} 01-04 15:14:18.849 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: --> END POST (72-byte body) 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: <-- 200 OK https://api.sunofbeaches.com/uc/user/login/9tykg (242ms) 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Server: nginx/1.21.4 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Date: Tue, 04 Jan 2022 07:15:14 GMT 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Content-Type: application/json;charset=UTF-8 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Transfer-Encoding: chunked 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Connection: keep-alive 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: sob_token: a_c07b72a7284e97561ba326d37529eb21 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Access-Control-Expose-Headers: sob_token 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Access-Control-Expose-Headers: l_c_i 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Access-Control-Allow-Headers: sob_token 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Access-Control-Allow-Headers: l_c_i 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: l_c_i: 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-Content-Type-Options: nosniff 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-XSS-Protection: 1; mode=block 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Cache-Control: no-cache, no-store, max-age=0, must-revalidate 01-04 15:14:19.091 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Pragma: no-cache 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Expires: 0 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-Frame-Options: DENY 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: {"success":true,"code":10000,"message":"登录成功","data":null} // 第一次显示成功 ———————————————————————————————— 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: <-- END HTTP (66-byte body) 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp D/Sugar APP: getClient sob_token is = a_c07b72a7284e97561ba326d37529eb21 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: --> POST https://api.sunofbeaches.com/uc/user/login/9tykg 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Content-Type: application/json; charset=UTF-8 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Content-Length: 72 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: l_c_i: 927943204983013376 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: {"password":"8fb4158cbc09d35553039aaae2d8c605","phoneNum":"13602873056"} 01-04 15:14:19.092 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: --> END POST (72-byte body) 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: <-- 200 OK https://api.sunofbeaches.com/uc/user/login/9tykg (122ms) 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Server: nginx/1.21.4 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Date: Tue, 04 Jan 2022 07:15:14 GMT 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Content-Type: application/json;charset=UTF-8 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Transfer-Encoding: chunked 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Connection: keep-alive 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-Content-Type-Options: nosniff 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-XSS-Protection: 1; mode=block 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Cache-Control: no-cache, no-store, max-age=0, must-revalidate 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Pragma: no-cache 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: Expires: 0 01-04 15:14:19.215 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: X-Frame-Options: DENY 01-04 15:14:19.216 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: {"success":false,"code":11111,"message":"人类验证码不正确","data":null} // 第二次验证码错误 —————————————————————————————— 01-04 15:14:19.216 15196-15244/com.lcq.st.sugarapp I/okhttp.OkHttpClient: <-- END HTTP (79-byte body) 01-04 15:14:19.224 15196-15196/com.lcq.st.sugarapp E/-->: sobuser = SobUser{success=false, code=11111, message='人类验证码不正确', data=null} // 最后我这边打印报错信息
假设把拦截器部分注释 登录就正常 不过我的lci得通过日志获取 这部分有点不太理解 为啥加了拦截器就出错了
拦截器部分 public static OkHttpClient getClient() { OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); builder.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); builder.writeTimeout(DEFAULT_UPLOAD_TIMEOUT, TimeUnit.SECONDS); // 添加拦截器 +header builder.addInterceptor(new Interceptor() { @NotNull @Override public Response intercept(@NotNull Chain chain) throws IOException { Request original = chain.request(); Request.Builder builder1 = original.newBuilder(); Response response = chain.proceed(original); Headers headers = response.headers(); String l_c_i = headers.get("l_c_i"); String sob_token = headers.get("sob_token"); if(AllUtils.isStrNoEmpty(l_c_i)){ SpUtils.getInstance().putString(Constance.TUL_TOKEN,l_c_i); SLog.d("getClient l_c_i is = "+l_c_i); } if(AllUtils.isStrNoEmpty(sob_token)){ SLog.d("getClient sob_token is = "+sob_token); } Request request = builder1.build(); return chain.proceed(original); // 如果此处用request 的话 日志两次都是显示验证码失败 } }); // cookie保存 /*cookieJar = new PersistentCookieJar(new SetCookieCache(), new SharedPrefsCookiePersistor(SugarApplication.getContext())); SLog.d("cookieJar "+ cookieJar.toString()); builder.cookieJar(cookieJar);*/ if (BuildConfig.DEBUG) { HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY); builder.addInterceptor(httpLoggingInterceptor); } return builder.build(); }
还有是不是可以不需要cookie了呢 以后都是拿token值去对比么
之前学过内容提供者知道name和authorities的作用,那么exported表示什么,网上搜表示该 FileProvider 是否需要公开出去,但我们注册了这个内容提供者为什么还要公开出去,公开出去给谁用?
grantUripermissions又表示什么,网上搜:是否允许授权文件的临时访问权限。这里需要,所以是 true,但是在这个项目里,我获得的是外部私有空间,访问这个不是不需要权限的吗
最后这个meta-data标签,这个name代表是什么意思,是否可以随便填?这个resource指定的是一个xml,但是为什么要指定这个xml文件,这个xml文件代表是什么?
这个像是指定一个外部文件的路径,同样的访问外部私有空间不是不需要权限吗?这个项目是拍照然后取出照片并显示出来,这个照片的位置是 /storage/emulated/0/Android/data/com.example.camera/files/Pictures/image.jpg 这不是这个应用的外部私有空间吗,为什么还要再去写?
我是笨蛋别骂我,真的不知道为什么
我现在在加载验证码cookie 需要在retrofit先请求一遍才能记录cookie 但是验证码那块的获取的是image 我解析json格式时会报错
因为图灵的图是直接图片 我拿去解析object了 错误如下
Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
现在有几个问题需要请教一下
1.图灵图片需要怎样请求retrofit object-->解析错误 《 虽然Glide直接可以显示出来 但是没办法在这里拿到它的cookie
2.拦截器加cookie后 login登录的时候 携带cookie后 这样直接请求可以吗
3.cookie还有更简洁的获取方式吗 在Glide请求的时候也可以拿到 就可以先忽略1。了
我贴一贴请求的东西哈 可能格式不太美观
请求类
public interface GetSugarApi { @GET("uc/ut/captcha") Observable<String> getImage(@Query("code") String code); @GET("uc/user/avatar/{phone}") Observable<Sugar_photoBean> getPhoto(@Path("phone") String phone); @POST("uc/user/login/{captcha}") @FormUrlEncoded // 表单请求--> 不支持 Observable<Sugar_LoginBean> login(@Header("Content-Type") String s, @Path("captcha") String captcha, @Field("phoneNum") String phoneNum, @Field("password") String password); @POST("uc/user/login/{captcha}") Observable<Sugar_LoginBean> login2(@Path("captcha")String captcha, @Body RequestBody body); }
实现类
public class LoginActivity extends BaseActivity { private ImageView img_code; private EditText et_code; private Button btn_login; int i = 0; @Override public void initView() { btn_login = findViewById(R.id.btn_login); et_code = findViewById(R.id.et_code); img_code = findViewById(R.id.img_code); } private void login(String code) { LoginBean loginBean = new LoginBean("136XXXX3056","XXXXmd5"); RequestBody body = FormBody.create(MediaType.parse("application/json; charset=utf-8"), new Gson().toJson(loginBean)); Observable loginObservable = sugarApi.login2(code,body); loginObservable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<Sugar_LoginBean>() { @Override public void onSubscribe(@NonNull Disposable d) { Log.e("-->","loginObservable onSubscribe"); } @Override public void onNext(@NonNull Sugar_LoginBean loginBean) { Log.e("-->","loginObservable onSubscribe = "+loginBean.toString()); // 在这里总是验证码错误 大牛们说没携带cookie 后面在网上找了一种拦截器讲 cookie缓存的 贴在下面哈 } @Override public void onError(@NonNull Throwable e) { Log.e("-->","login onError "+ e.getMessage().trim()); } @Override public void onComplete() { } }); } @Override public int getLayoutId() { return R.layout.activity_login; } private Retrofit retrofit; private OkHttpClient okHttpClient ; private GetSugarApi sugarApi; private String baseUri = "https://api.sunofbeach.net/"; @Override public void initData() { okHttpClient = new OkHttpClient.Builder() .addInterceptor(new AddCookiesInterceptor(this)) .addInterceptor(new SaveCookiesInterceptor(this)).build(); retrofit = new Retrofit.Builder() .baseUrl(baseUri) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .client(okHttpClient) .build(); sugarApi = retrofit.create(GetSugarApi.class); requestTranslation(); loadImg(); img_code.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { i = i++; Glide.with(LoginActivity.this).load("https://api.sunofbeach.net/uc/ut/captcha?code="+i).into(img_code); } }); btn_login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String code = et_code.getText().toString(); login(code); } }); } private void loadImg() { int max = 9999 , min = 1000; int ranNum = (int) ( Math.random() * ( max - min ) + min ); Log.e("-->","random ranNum = "+ ranNum ); Glide.with(this).load(baseUri+"uc/ut/captcha?code="+ranNum).into(img_code); Observable<String> observable = sugarApi.getImage(ranNum+""); // // 创建的时候请求 observable.subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Observer<String>() { @Override public void onSubscribe(@NonNull Disposable d) { } @Override public void onNext(@NonNull String s) { Log.e("-->","loadImg onNext "+s.toString()); } @Override public void onError(@NonNull Throwable e) { Log.e("-->","loadImg onError "+e.getMessage().toString()); } @Override public void onComplete() { } }); }
两个cookie拦截器类
public class SaveCookiesInterceptor implements Interceptor { private static final String COOKIE_PREF = "cookies_prefs"; private Context mContext; public SaveCookiesInterceptor(Context context) { mContext = context; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Response response = chain.proceed(request); //set-cookie可能为多个 if (!response.headers("set-cookie").isEmpty()) { List<String> cookies = response.headers("set-cookie"); String cookie = encodeCookie(cookies); //解析 saveCookie(request.url().toString(), request.url().host(), cookie); // 存入 } return response; } //整合cookie为唯一字符串 private String encodeCookie(List<String> cookies) { StringBuilder sb = new StringBuilder(); Set<String> set=new HashSet<>(); for (String cookie : cookies) { String[] arr = cookie.split(";"); for (String s : arr) { if(set.contains(s))continue; set.add(s); } } Iterator<String> ite = set.iterator(); while (ite.hasNext()) { String cookie = ite.next(); sb.append(cookie).append(";"); } int last = sb.lastIndexOf(";"); if (sb.length() - 1 == last) { sb.deleteCharAt(last); } return sb.toString(); } //保存cookie到本地,这里我们分别为该url和host设置相同的cookie,其中host可选 //这样能使得该cookie的应用范围更广 private void saveCookie(String url,String domain,String cookies) { SharedPreferences sp = mContext.getSharedPreferences(COOKIE_PREF, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sp.edit(); if (TextUtils.isEmpty(url)) { throw new NullPointerException("url is null."); }else{ editor.putString(url, cookies); } if (!TextUtils.isEmpty(domain)) { editor.putString(domain, cookies); } editor.apply(); } } public class AddCookiesInterceptor implements Interceptor { private static final String COOKIE_PREF = "cookies_prefs"; private Context mContext; public AddCookiesInterceptor(Context context) { mContext = context; } @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request(); Request.Builder builder = request.newBuilder(); String cookie = getCookie(request.url().toString(), request.url().host()); if (!TextUtils.isEmpty(cookie)) { builder.addHeader("Cookie", cookie); } return chain.proceed(builder.build()); } private String getCookie(String url, String domain) { SharedPreferences sp = mContext.getSharedPreferences(COOKIE_PREF, Context.MODE_PRIVATE); if (!TextUtils.isEmpty(url)&&sp.contains(url)&&!TextUtils.isEmpty(sp.getString(url,""))) { return sp.getString(url, ""); } if (!TextUtils.isEmpty(domain)&&sp.contains(domain) && !TextUtils.isEmpty(sp.getString(domain, ""))) { return sp.getString(domain, ""); } return null; } }
beforeBitmap.compress(Bitmap.CompressFormat.JPEG, options, bos);
已知 以上代码是对于图片进行压缩 那如果压缩的是gif图呢 需要换成流去压缩吗
用该代码去压缩gif 生成的是gif结尾的图片 可是栋不起来了 这点比较疑惑 希望各位大佬点醒一下
我的压缩代码如下
String directoryPrefix = context.getExternalFilesDir("").getAbsolutePath()+SLASH; String imagepath = directoryPrefix +"sugar"+ SLASH + "image"+SLASH; File file = new File(imagepath); if (!file.exists()) { file.mkdirs(); } // 可以捕获内存缓冲区的数据,转换成字节数组。 ByteArrayOutputStream bos = new ByteArrayOutputStream(); if (beforeBitmap != null) { // 第一个参数:图片压缩的格式;第二个参数:压缩的比率;第三个参数:压缩的数据存放到bos中 beforeBitmap.compress(Bitmap.CompressFormat.JPEG, quality, bos); // 循环判断压缩后的图片大小是否满足要求,这里限制100kb,若不满足则继续压缩,每次递减10%压缩 int options = quality; // 70 while (bos.toByteArray().length / 1024 > maxSize) { bos.reset();// 置为空 beforeBitmap.compress(Bitmap.CompressFormat.JPEG, options, bos); options -= 5; // 每次减少5的压缩质量 } // 转化为文件 try { File compressImageFile = null; if (isGif ){ compressImageFile = File.createTempFile("image", ".gif", file); }else { compressImageFile = File.createTempFile("image", ".jpg", file); } // 写入 绝对路径 uncompressImageWithLowQuality(compressImageFile.getAbsolutePath() , bos); return compressImageFile.getAbsolutePath(); } catch (IOException e) { SLog.e("createTempFile error is e ="+ e.getMessage()); e.printStackTrace(); } // 从bos中将数据读出来 转换成图片(位图) // ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); // Bitmap afterBitmap = BitmapFactory.decodeStream(bis); // return afterBitmap; } return null;
假设我使用的SQL语句 查出来的结果是上表
SELECT * FROM st_baidu_refer_sdr WHERE INSERT_TIME BETWEEN 20210101000000 AND 20220114235959 and ENTERPRISE_ID = 123123 ORDER BY INSERT_TIME
那我怎么把它在sql导出成以下形式呢 是用多表查询么 如果没创建表的前提下能完成么 第三列的结果是上面查询结果的行数 时间倒是可以计算 eID也可以用上面eid 不过导出成下面格式我不太理解 可以操作么

所以现在有两个疑问
我在application.yml中设置了hikari:maximum-pool-size:100
但我检查actuator/metrics/hikaricp.connections.max = 10
这是什么原因?
PS:有没有比较简单好用的线程管理监控方案
各位大佬们 晚上好 ,
有个问题 求各位大神瞅一眼。
今天遇到一个bug 如下图(动图转换成链接了,只是个概念图 设备不在身边没办法百分百复现)
链接 http://m.qpic.cn/psc?/V10HPnpE4LATa2/ruAMsa53pVQWN7FLK88i5hGe9BiLdnJv6ruNEyq3TEvTBQ0fwViEAvZHo1OUyw6SDCDqtroo17q1MHn*vI7Jrr3TNmEjV6I.OuhmPvrqFcQ!/b&bo=aAHwAAAAAAACJ5o!&rf=viewer_4
我调查之后发现 这个bug的原因是 因为mHandler.postDelayed 被调用时 偶现出现两个线程对progress 进行操作的现象,从而导致控件的值闪烁。
这是我打的log,确实有两个线程一起走到onImportFlie()方法....
不太理解为什么会出现两个线程,线程结束是run执行完后结束吗?
我自己总结了两个方法来应对这种情况,但是我不知道该怎么写代码....
1.在控件使用mHandler.postDelayed时 就防止它出现多个线程的问题 比如 防止频繁点击(防止频繁点击对我这个不太有效)
2.在数据处理的时候 只允许一个线程对数据进行操作 如果此时有第二个线程也想对数据进行操作 就干掉它.... (确实不会写)
总之就是 在“多个线程产生前” 和 “多个线程调用同一对象时” 这两个时间点进行处理,从而解决这种现象。
各位大神们 有什么好的建议吗?
mHandler.postDelayed(new Runnable() { @Override public void run() { //通过中间层通知Model层进行文件导入动作 } }, 500); //Model层 导入方法 public void onImportFlie() { Iterator iterator = newfileInfos.iterator(); while (iterator.hasNext()) { try { @Override public void onProgress ( long transferSize){ //todo 通知进度 transferSize += finalSize; mProgressInfo.setFilePath(fileInfo.filePath); int progress = (int) (transferSize * 100 / mProgressInfo.getTotalSize()); mProgressInfo.setProgress(progress); } } } } PS:代码我随便粘贴了两句 大家懂我意思就行 太长了没必要都贴出来...
1.今天完成了周排行榜 关注情况的优化 不过借口返回的回答问题数是总的 估计没有进行时间筛选
2
2.https://images.sunofbeaches.com/content/2021_11_16/910128376692342784.png
后缀返回是.png 其实是.gif的动图 估计是后台返回的后缀有些许问题

现在公司代码层是好几年前写的java代码 我看到base层把所有activity都添加在stack<Activity>内 这似乎是很久前的写法了 还有必要继续添加在堆栈内么 我感觉现在应该是有自动写入的吧 很少看到有人写在stack内部去管理了
一般来说本地数据库和网络数据库同时存在
但在什么时候使用本地 什么时候使用网络(判断条件是 数据修改?)
当我缓存在本地之后 我网络数据修改了 我要怎么去通知本地我进行修改了呢 (怎么知道它数据修改了呢 后端可以给一条数据修改通知?)
要每次打开都进行网络数据请求 对比? 然后将本地数据库数据替换吗
自己在手写数据库和bmob数据库对比时遇到了这个疑惑
我感觉如果每次打开都要请求数据进行对比
那本地数据库的意义只有当网络环境很差时才去查询数据吗
接触SpringSecurity好久了,但是总是搞不明白怎么写。
我现在有这几个需求,想请各位资深大牛指点下,怎么用spring security实现:
1.登录
提供自定义登录接口,提交数据后返回token
失败返回自定义信息
2.怎样支持手机号验证码登录或邮箱验证码登录
默认的接口只能通过username,password登录
3. 支持携带token访问
下次访问时,通过token来判断这个用户是否登录了,默认的登录接口没有可定义的地方
4.便捷的决定访问此接口需要哪些权限
也就是限制接口的访问,只允许指定角色才允许访问,若无此角色,返回提示
比如写了几十个接口,不可能都在配置类里一条一条的写 antMatchers(xxx)

https://www.bilibili.com/video/BV1Dk4y1C7mm?p=10&vd_source=8e4f3c6cc6d369c0c0856f5ff5089007
请问有人跟着敲代码吗。第十节课。DataListenContainer 里面的value 值没更新上。是什么情况。视频23:45 左右。点那个暂停按钮后,按钮的文字并没有变成播放。
currentMusic.value 和currentPlayState.value 就每次设完值都是null? kotlin语法究竟是啥玩意 。
附一个demo 地址。https://github.com/YolandaLeung/jetpack_b_station 涉及文件跟视频教程一致。。

- 1
- 2