<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[TianDevelopers的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/TianDevelopers</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; TianDevelopers]]></copyright><item><title><![CDATA[grpc-java examples运行及遇到的问题]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/128694140</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/128694140</guid><author>TianDevelopers</author><pubDate>Sun, 15 Jan 2023 14:38:22 +0800</pubDate><description><![CDATA[调试运行grpc-java官方demo，examples。默认你已经下载了androidstudio，并配置好了android开发环境。这是本人在运行demo过程中的总结，如需查看官方文档，请参阅。]]></description><category></category></item><item><title><![CDATA[理解gradle和gradlew]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/128688657</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/128688657</guid><author>TianDevelopers</author><pubDate>Sat, 14 Jan 2023 20:30:24 +0800</pubDate><description><![CDATA[最近在跑grpc官方示例程序的时候，用到了在命令行中使用gradle编译生成代码。对gradle和gradlew做了一些了解。]]></description><category></category></item><item><title><![CDATA[初始GRPC（二）]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/128684807</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/128684807</guid><author>TianDevelopers</author><pubDate>Sat, 14 Jan 2023 14:51:56 +0800</pubDate><description><![CDATA[例如，服务器可以等到收到客户端的所有消息后再编写消息，或者服务器和客户端可以打“乒乓球”——服务器收到请求，然后发回响应，然后客户端根据响应发送另一个请求，依此类推。元数据是有关特定RPC调用的信息（如身份验证详细信息），其形式为键值对列表，其中键是字符串，值通常是字符串，但也可以是二进制数据。元数据是有关特定RPC调用的信息（如身份验证详细信息），其形式为键值对列表，其中键是字符串，值通常是字符串，但也可以是二进制数据。gRPC不使用用户定义的元数据，它允许客户端向服务器提供与调用相关的信息，反之亦然。]]></description><category></category></item><item><title><![CDATA[初步了解GRPC（一）]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/128633104</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/128633104</guid><author>TianDevelopers</author><pubDate>Tue, 10 Jan 2023 21:29:14 +0800</pubDate><description><![CDATA[RPC是Remote Procedure Call的简称，翻译成中文就是远程过程调用。区别于LPC，Local Procedure Call本地过程调用。RPC就是提供跨进程访问的一种机制。我们知道不同进程之间是不能直接访问的，需要通过跨进程访问的方式进行互相调用。安卓跨进程的方式有：Binder、ContentProvide、Handler、GRPC跨进程调用的过程如下图：详细了解RPC可以参阅如何给老婆解释什么是RPC，文章通俗易懂，浅显有趣。可以阅读官方文档。]]></description><category></category></item><item><title><![CDATA[常用adb命令记录]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/128445939</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/128445939</guid><author>TianDevelopers</author><pubDate>Tue, 10 Jan 2023 20:52:22 +0800</pubDate><description><![CDATA[常用adb命令记录。]]></description><category></category></item><item><title><![CDATA[一口气看完View的绘制流程]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/128436944</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/128436944</guid><author>TianDevelopers</author><pubDate>Thu, 29 Dec 2022 22:15:26 +0800</pubDate><description><![CDATA[上面注释很清楚，说的是，addViewInner将调用chid.requestLayout()，当设置新的LayoutParams，然而，我们在这之前调用requestLayout方法，所以child的请求将在我们这个级别阻塞。最后，在measureHierarchy方法中，调用了performMeasure方法之后，也调用了performLayout方法和performDraw方法，确定了view的位置，以及将view绘制在了屏幕上。方法，这里的root是ViewGroup。]]></description><category></category></item><item><title><![CDATA[Jetpack LiveData]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/125079166</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/125079166</guid><author>TianDevelopers</author><pubDate>Wed, 01 Jun 2022 13:50:22 +0800</pubDate><description><![CDATA[LiveData 是一种可观察的数据存储器类。与常规的可观察类不同，LiveData 具有生命周期感知能力，意指它遵循其他应用组件（如 Activity、Fragment 或 Service）的生命周期。这种感知能力可确保 LiveData 仅更新处于活跃生命周期状态的应用组件观察者。
详细介绍参阅官方文档1.实例化一个LiveData，因为LiveData是抽象类，所以一般实例化其子类MutableLiveData
2.通过setValue、postValue方法设置要观察的对象
3.通过observer]]></description><category></category></item><item><title><![CDATA[JetPack Lifecycle]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/125031023</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/125031023</guid><author>TianDevelopers</author><pubDate>Sun, 29 May 2022 16:15:47 +0800</pubDate><description><![CDATA[JetPack Lifecycle
1 .Lifecyle组件简介
LifeCycle组件是一个用于观察activity/fragment生命周期的组件。
2.相关类
1.Lifecycle 是一个类，用于存储有关组件（如 Activity 或 Fragment）的生命周期状态的信息，并允许其他对象观察此状态。

图 1. 构成 Android Activity 生命周期的状态和事件
类可以通过实现 DefaultLifecycleObserver 并替换相应的方法（如 onCreate 和 onStart]]></description><category></category></item><item><title><![CDATA[协程 组合挂起函数]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/124820868</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/124820868</guid><author>TianDevelopers</author><pubDate>Tue, 17 May 2022 23:33:44 +0800</pubDate><description><![CDATA[协程 组合挂起函数
1.按默认的顺序执行
假设我们有两个挂起函数声明在任何地方，它做一些有用的事情像访问远程服务或者进行计算密集型操作。我们假设它上有意义的，但实际上，出于此示例的目的，每个都只是延迟一秒钟：
suspend fun doSomethingUsefulOne(): Int {
    delay(1000L) // pretend we are doing something useful here
    return 13
}

suspend fun doSomethingUseful]]></description><category></category></item><item><title><![CDATA[协程的取消与超时]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/124815905</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/124815905</guid><author>TianDevelopers</author><pubDate>Tue, 17 May 2022 12:48:33 +0800</pubDate><description><![CDATA[协程的取消与超时
1.取消协程的执行
一个长时间运行的应用程序，你可能需要细粒度的控制后台协程。例如，你已经关闭了一个启动协程的页面，该协程的运行结果已经不再需要，该协程可以取消其操作。launch函数返回了job实例，可以使正在运行的协程取消。
import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        repeat(1000) { i -&gt;
            println("j]]></description><category></category></item><item><title><![CDATA[Corountin协程基础]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/124809434</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/124809434</guid><author>TianDevelopers</author><pubDate>Mon, 16 May 2022 22:52:16 +0800</pubDate><description><![CDATA[Corountin协程基础
本文是阅读官方文档，结合自己的理解而写，如有错误之处，还请不吝斧正。
也可直接阅读官方文档链接如下：
https://kotlinlang.org/docs/coroutines-basics.html
1.什么是协程和线程有什么区别？
协程相对于线程，就好比线程相对于进程概念。一个进程可以运行多个线程，一个线程上也可以运行多个协程。协程运行在线程上，可以把一段代码挂起运行在一个线程上，并在运行结束后再另个一线程上恢复。
2.第一个协程程序
import kotlinx.coro]]></description><category></category></item><item><title><![CDATA[Java中 ? extends T 和 ? super T 的理解]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/124804182</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/124804182</guid><author>TianDevelopers</author><pubDate>Mon, 16 May 2022 17:35:52 +0800</pubDate><description><![CDATA[Java中 ? extends T 和 ? super T 的理解
有关extends和super的理解
    class Food{}
    class Fruit extends Food{}
    class Apple extends Fruit{}

    public void test() {
        //表示只知道元素是Fruit子类，但不知道是那个子类，所以不允许任何继承于Fruit的子类存入该集合
        //但是允许从该集合中获取元素，获取的元素可以向上转型为F]]></description><category></category></item><item><title><![CDATA[Retrofit源码解析]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/124775369</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/124775369</guid><author>TianDevelopers</author><pubDate>Sun, 15 May 2022 12:37:27 +0800</pubDate><description><![CDATA[Retrofit源码解析
1.基本使用
retrofit一般和okhttp配合使用
首先创建okhttpClient实例对象
    val okHttpClient by lazy {
        val build = OkHttpClient.Builder()
        build.readTimeout(10000, TimeUnit.MILLISECONDS)
        build.writeTimeout(10000, TimeUnit.MILLISECONDS)
      ]]></description><category></category></item><item><title><![CDATA[Flutter开发环境配置]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/124193077</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/124193077</guid><author>TianDevelopers</author><pubDate>Fri, 15 Apr 2022 21:22:00 +0800</pubDate><description><![CDATA[文章目录前言一、打开Flutter官网二、安装和环境配置1.查看中国网络环境下使用flutter这篇文章2.Mac上设置3.Windows上设置4.AndroidStudio插件安装

前言
Android开发配置Flutter开发环境
本文描述了个人配置Flutter开发环境的过程及遇到的一些问题，供大家参考。(请先安装androidstudio并配置好环境)

一、打开Flutter官网

flutter中文网
flutter官网
以flutter中文网为例，进入flutter中文网，点击Get Sta]]></description><category></category></item><item><title><![CDATA[Androidstudio编译工程找不到对应的gradle-x.xx-all.zip文件的解决方法]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/124189481</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/124189481</guid><author>TianDevelopers</author><pubDate>Fri, 15 Apr 2022 11:09:54 +0800</pubDate><description><![CDATA[有时间我们会遇到Gradle下载不下来的问题，如果解决呢？
首先在项目工程的gradle/wrapper目录下打开gradle-wrapper.properties文件]]></description><category></category></item><item><title><![CDATA[基于Androidx+Fragment源码分析fragment重叠的原因]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/115010176</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/115010176</guid><author>TianDevelopers</author><pubDate>Fri, 19 Mar 2021 17:08:19 +0800</pubDate><description><![CDATA[本文基于implementation "androidx.fragment:fragment-ktx:1.3.1"源码，分析了为什么fragment以show/hide方式，在Activity内存不足重新打开时会出现重叠问题的原因，及解决思路。
首先查看Activity的super.onSaveInstanceState(outState)方法
最后会在Activity中的onSaveInstanceState方法中看到
Parcelable p = mFragments.saveAllState();
i]]></description><category></category></item><item><title><![CDATA[BottomNavigation+fragment实现，解决因内存不足系统回收Activity，或者屏幕旋转导致Activiy重建导致fragment重叠的问题]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/114638806</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/114638806</guid><author>TianDevelopers</author><pubDate>Wed, 10 Mar 2021 16:46:08 +0800</pubDate><description><![CDATA[1.基于BottomNavigation+fragment通过show/hide的方式实现首页面
2.出现fragment重叠的原因可点击这里查看
具体原因总结如下：

因内存不足导致Activity被系统回收，或者屏幕旋转导致Activity重建，Activity会保存fragment的实例，但是不会保存fragment show/hide的状态，当Activity重建时，重新走onCreate方法，会重新创建fragment的实例，此时重新创建的fragment实例，和Activity保存的fragme]]></description><category></category></item><item><title><![CDATA[Https原理详解]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/113383684</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/113383684</guid><author>TianDevelopers</author><pubDate>Fri, 29 Jan 2021 14:39:14 +0800</pubDate><description><![CDATA[Http 超文本传输协议
Https 安全套接字超文本传输协议
Https用到了ssl加密技术，了解ssl需要先了解加密相关的知识。
有关知识为什么是对称加密，什么是非对称加密？什么是数字摘要？什么是数字签名？
1.对称加密和非对称加密

1、对称加密(也叫私钥加密)，是指加密和解密使用相同的密钥的加密算法。有时又叫传统加密算法，就是加密密钥能够从解密密钥中推算出来，同时解密密钥也可以从加密密钥中推算出来。而在大多数的对称算法中，加密密钥和解密密钥是相同的，所以也称这种加密算法为秘密密钥或者单密钥算法，常见]]></description><category></category></item><item><title><![CDATA[okhttp3.9.1源码初探]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/113183924</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/113183924</guid><author>TianDevelopers</author><pubDate>Wed, 27 Jan 2021 09:51:23 +0800</pubDate><description><![CDATA[okhttp3.9.1源码初探

简单调用方式


get同步调用调用

public class GetExample {
//1.创建OkHttpClient对象
  OkHttpClient client = new OkHttpClient();

  String run(String url) throws IOException {
  //2.通过Builder建造者模式创建Request对象
    Request request = new Request.Builder()
     ]]></description><category></category></item><item><title><![CDATA[android适配华为虚拟键]]></title><link>https://blog.youkuaiyun.com/TianDevelopers/article/details/81702957</link><guid>https://blog.youkuaiyun.com/TianDevelopers/article/details/81702957</guid><author>TianDevelopers</author><pubDate>Wed, 15 Aug 2018 14:04:50 +0800</pubDate><description><![CDATA[在做横竖屏展示时，发现网上适配虚拟键代码没有做横屏状态下适配，导致横屏状态下，底部虚拟键遮挡了布局内容。

所以横屏状态下也需要适配华为虚拟键。只需要在content布局改变时，同时记录当前可用的视图宽度，重新请求布局即可。下面是代码：


import android.content.Context;
import android.content.res.Resources;
import an...]]></description><category></category></item></channel></rss>