全部 文章 问答 分享 共找到41个相关内容
[问答] 关于Android GPS定位的疑问


### 第三方地图疑问


地图也是调用系统提供的接口吧。

2022-10-21 11:33 · GPS / Android
[问答] android 听书那个项目 有点小疑问 还请多帮帮忙 谢谢
就是在PlayerPresenter逻辑类中,谁去调用播放器的回调方法onPlayProgress(),然后在由回调去调用里面的onProgressChange(),疑问就是不是太明白谁去调用该方法?
2020-03-26 19:51 · Android
[问答] 阳光沙滩个人博客后台学习中的几个疑问
小生刚学完后台,有几个疑问问题一:下面这里为什么要用callable开启一个新线程执行啊,而且不是cllable.start()执行的而是直接callable.call(),这样不就是直接在主线程执行吗问题二
2020-10-23 19:07 · sob个人博客系统
[问答] view父布局
我对view父布局的理解有点疑问,popview的父布局是谁?需要大佬点我一下
2019-12-28 11:10 · view父布局
[问答] activity.finish()之后还能弹toast吗

有个疑问Fragment里面执行了activity.finish()的操作 之后,还能接着弹toast吗

2022-12-15 15:46 · Android
[问答] 有哪里可以学习多点UI交互吗
断点的沙滩APP中的 发送摸鱼动态 Topic话题选项 的UI是自定义的吗 点击弹出后还可以继续往上拖动 是自定义向上的抽屉View吗

有些UI交互还是觉得需要多学多看才懂

还有个疑问

2021-12-13 09:14 · UI
[问答] 怎样方便的获取图像的坐标
images.sunofbeaches.com/content/2022_07_27/1001845006287241216.png">

最近在学自定义View,例如画个心型,根据上面的红框的坐标去画,这时我就有疑问

2022-07-27 13:40 · 自定义View
[问答] 管理中心文章文章条件查询返回数据不一致?
疑问1:在后端使其格式统一?疑问2:在前端实现某种提取?
2020-09-17 23:21 · 管理中心 / java后端
[问答] 阳光沙滩登录API 请求疑问

想开一个新的学习工程(在公司太闲了) 然后想到沙滩有公开API 放在postman先试试 图灵好了 登录这块是我请求错误了 md5摘要 这里显示的是密码错误吗 我拿我登录的密码去MD5后取32位小写放置 请求出结果错误

求大牛们指点一下呀

2021-12-03 10:25 · 沙滩登录
[问答] 拦截器影响登录疑问
通过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值去对比么

2022-01-04 15:26 · 拦截器
[问答] 关于Fileprovide我有几点疑问

之前学过内容提供者知道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 这不是这个应用的外部私有空间吗,为什么还要再去写?

我是笨蛋别骂我,真的不知道为什么

2023-04-27 08:09 · Android
[问答] 关于沙滩登录cookie疑问

我现在在加载验证码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;
    }
}





2021-12-06 11:23 · cookie
[问答] 压缩gif 动图疑问
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;
2022-08-04 18:16 · 压缩gif
[问答] 喜马拉雅有个疑问
这个是接口回调返回结果,只有获取到数据后再setAdapter后,Adapter的getItemCount返回才不是0,这是因为什么?这个是老师的代码,老师这边是先setAdapter,然后再去通过接口回调返回数据,但是我跟老师一样的话,在Adapter里的getItemCount返回的就是0,这是为什么?
2020-08-08 11:43 · 喜马拉雅
[问答] Android 视频图片播放demo疑问
1.把屏幕划分成四份,每个区域都要可以播放视频和图片。点击选择每块区域来选择是播放图片还是视频。视频可以用videoView,图片可以用ImageView。但是这个点击选择我应该咋处理?
2020-09-03 09:50 · Android
[问答] SQL语句查询结果导出疑问


假设我使用的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 不过导出成下面格式我不太理解 可以操作么

2022-01-14 13:39 · SQL
[问答] Javaweb 跑网页 显示404问题

所以现在有两个疑问

2021-09-24 15:23 · javaweb
[问答] springboot hikari 最大线程数的疑问

我在application.yml中设置了hikari:maximum-pool-size:100

但我检查actuator/metrics/hikaricp.connections.max = 10

这是什么原因?

PS:有没有比较简单好用的线程管理监控方案

2025-01-20 18:02 · springboot / hikari
[问答] 求大神解惑 Android 线程的一些疑问

各位大佬们 晚上好 ,


有个问题 求各位大神瞅一眼。


今天遇到一个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:代码我随便粘贴了两句  大家懂我意思就行  太长了没必要都贴出来...
    
    



2022-12-19 22:57 · Android / 线程 / 多线程
[问答] 关于沙滩一些借口的疑问

1.今天完成了周排行榜 关注情况的优化 不过借口返回的回答问题数是总的 估计没有进行时间筛选




2

2.https://images.sunofbeaches.com/content/2021_11_16/910128376692342784.png

后缀返回是.png 其实是.gif的动图 估计是后台返回的后缀有些许问题

2022-02-24 10:23 · web
[文章] Kotlin项目实战——天气预报类APP
总结总的来说,使用Kotlin来开发项目会让项目的开发变得简单,这是毫无疑问的。但不知道为何代码编译时间要长的多。虽然听说在国外kotlin已经很火了,但在国内似乎没有想象中的热度呢。
2020-08-13 14:34 · Kotlin / 实战
[问答] 康师傅自定义view教程中,滑动删除view疑问
//测量自己,宽度就是内容+编辑view。高度内容高度setMeasuredDimension(contentMeasuredWidth+editWidth,contentView.getMeasuredHeight());为什么自己的宽度要这么长?内容的宽度不是已经达到了最大了,现在加上编辑view的宽度,这样就超越了。
2020-06-12 09:34 · Android / 自定义view
[问答] 关于Activity是否还需要添加在堆栈疑问

现在公司代码层是好几年前写的java代码 我看到base层把所有activity都添加在stack<Activity>内 这似乎是很久前的写法了 还有必要继续添加在堆栈内么 我感觉现在应该是有自动写入的吧 很少看到有人写在stack内部去管理了

2022-03-07 10:28 · stack
[问答] 关于本地数据库和网络数据库的疑问

一般来说本地数据库和网络数据库同时存在

但在什么时候使用本地 什么时候使用网络(判断条件是 数据修改?)

当我缓存在本地之后 我网络数据修改了 我要怎么去通知本地我进行修改了呢 (怎么知道它数据修改了呢 后端可以给一条数据修改通知?)

要每次打开都进行网络数据请求 对比? 然后将本地数据库数据替换吗

自己在手写数据库和bmob数据库对比时遇到了这个疑惑


我感觉如果每次打开都要请求数据进行对比

那本地数据库的意义只有当网络环境很差时才去查询数据吗

2021-12-01 10:30 · 数据库
[问答] 关于SpringSecurit使用到前后端分离项目的几个疑问

接触SpringSecurity好久了,但是总是搞不明白怎么写。

我现在有这几个需求,想请各位资深大牛指点下,怎么用spring security实现:


1.登录

   提供自定义登录接口,提交数据后返回token

   失败返回自定义信息


2.怎样支持手机号验证码登录或邮箱验证码登录

默认的接口只能通过username,password登录


3. 支持携带token访问

   下次访问时,通过token来判断这个用户是否登录了,默认的登录接口没有可定义的地方


4.便捷的决定访问此接口需要哪些权限

   也就是限制接口的访问,只允许指定角色才允许访问,若无此角色,返回提示

比如写了几十个接口,不可能都在配置类里一条一条的写 antMatchers(xxx)

2021-10-12 22:59 · SpringSecurity
[文章] 博客系统--增加友情链接的改动
博客系统在增加友情链接的时候,发现存在疑问的地方增加友情链接的时候,需要判断数据库是否存在更新友情链接的时候,提交空的body也算成功的问题新增publicResponseResultaddFriendLink
2020-10-11 14:45 · 博客系统 / Java / 后端
[文章] 安卓开发-控件自定义属性
configChangesfloat,浮点数,也就是小数,比如说,透明度alphafraction,百分数,比如说动画的开始位置,fromDxrefrence,引用,比如说background,src,有同学可能有疑问
2019-11-21 15:31 · 安卓 / 自定义属性 / 布局 / 自定义控件 / view
[问答] P1-Android开发-Jetpack我们从MVVM开始 第十课疑问

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 涉及文件跟视频教程一致。。

2022-06-22 16:28 · android
[文章] Netty权威指南读书笔记
是否支持跨语言编码后的码流大小编解码的性能API友好程度使用者开发难度和维护难度推荐资料UNIX系统网络编程知识<UNIX网络编程>Javabug问题http://bugs.java.com/bugdatabase疑问
2020-10-05 11:36 · Netty / 高性能 / 服务器 / 读书笔记
  • 1
  • 2