### 第三方地图疑问
地图也是调用系统提供的接口吧。
有个疑问Fragment里面执行了activity.finish()的操作 之后,还能接着弹toast吗
各位大佬们 晚上好 ,
有个问题 求各位大神瞅一眼。
今天遇到一个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:代码我随便粘贴了两句 大家懂我意思就行 太长了没必要都贴出来...
有些UI交互还是觉得需要多学多看才懂
还有个疑问
最近在学自定义View,例如画个心型,根据上面的红框的坐标去画,这时我就有疑问
想开一个新的学习工程(在公司太闲了) 然后想到沙滩有公开API 放在postman先试试 图灵好了 登录这块是我请求错误了 md5摘要 这里显示的是密码错误吗 我拿我登录的密码去MD5后取32位小写放置 请求出结果错误
求大牛们指点一下呀
我现在在加载验证码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;
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 涉及文件跟视频教程一致。。
假设我使用的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:有没有比较简单好用的线程管理监控方案
at android.widget.FrameLayout.layoutChildren
1.今天完成了周排行榜 关注情况的优化 不过借口返回的回答问题数是总的 估计没有进行时间筛选
2
2.https://images.sunofbeaches.com/content/2021_11_16/910128376692342784.png
后缀返回是.png 其实是.gif的动图 估计是后台返回的后缀有些许问题

- 1
- 2
- 3
- 4
- 5
- 6
- 46