<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Android on 代码学习站</title>
        <link>https://a6233.com/tags/android/</link>
        <description>Recent content in Android on 代码学习站</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Tue, 01 Apr 2025 00:00:00 +0000</lastBuildDate><atom:link href="https://a6233.com/tags/android/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>requestLayout() 和 invalidate() 作用</title>
        <link>https://a6233.com/posts/requestlayout-%E5%92%8C-invalidate-%E4%BD%9C%E7%94%A8/</link>
        <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://a6233.com/posts/requestlayout-%E5%92%8C-invalidate-%E4%BD%9C%E7%94%A8/</guid>
        <description>&lt;p&gt;&lt;code&gt;requestLayout()&lt;/code&gt; 和 &lt;code&gt;invalidate()&lt;/code&gt; 是 Android 中 View 类的两个重要方法，用于不同的视图更新场景。让我解释它们的作用和区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;requestLayout() 方法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;请求重新测量和布局整个视图树。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发视图的 onMeasure() 和 onLayout() 方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于视图的大小或位置发生变化时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;调用时机：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当视图的尺寸需要改变时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当视图的位置需要改变时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当视图的子视图发生增删或其布局参数变化时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例子：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;button.setVisibility(View.GONE);
parentLayout.requestLayout();
&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
&lt;li&gt;invalidate() 方法&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;请求重绘视图。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发视图的 onDraw() 方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;用于视图的内容或外观需要更新，但尺寸和位置不变时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;调用时机：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;当视图的颜色、文本内容等发生变化时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当需要重新绘制自定义视图的内容时。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;动画更新时。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例子：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;textView.setTextColor(Color.RED);
textView.invalidate();
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;主要区别：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;影响范围：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 可能影响整个视图层次结构的布局。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 通常只影响调用它的视图及其子视图。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;性能影响：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 开销较大，因为它可能导致整个视图树的重新测量和布局。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 开销相对较小，通常只涉及重绘。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;触发的回调：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 触发 onMeasure() 和 onLayout()，可能还会触发 onDraw()。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 主要触发 onDraw()。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;使用场景：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 用于影响视图结构或尺寸的变化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 用于视图内容或外观的更新。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;线程安全：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;requestLayout(): 可以在非 UI 线程调用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;invalidate(): 只能在 UI 线程调用。（非 UI 线程应使用 postInvalidate()）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际使用示例：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;public class CustomView extends View {
    private int mColor;

    public void setColor(int color) {
        mColor = color;
        invalidate(); // 只需要重绘
    }

    public void setNewSize(int width, int height) {
        getLayoutParams().width = width;
        getLayoutParams().height = height;
        requestLayout(); // 需要重新测量和布局
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        // 使用 mColor 绘制
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;在这个例子中，改变颜色只需要 invalidate()，而改变尺寸则需要 requestLayout()。&lt;/p&gt;
&lt;p&gt;理解这两个方法的区别和适用场景对于优化 Android 应用的性能和创建响应式 UI 非常重要。如果你想了解更多关于如何在复杂场景中使用这些方法，或者需要更多的代码示例，我可以为你提供更详细的信息。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>编译 android 源码找不到 python 方法解决记录</title>
        <link>https://a6233.com/posts/%E7%BC%96%E8%AF%91-android-%E6%BA%90%E7%A0%81%E6%89%BE%E4%B8%8D%E5%88%B0-python-%E6%96%B9%E6%B3%95%E8%A7%A3%E5%86%B3%E8%AE%B0%E5%BD%95/</link>
        <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://a6233.com/posts/%E7%BC%96%E8%AF%91-android-%E6%BA%90%E7%A0%81%E6%89%BE%E4%B8%8D%E5%88%B0-python-%E6%96%B9%E6%B3%95%E8%A7%A3%E5%86%B3%E8%AE%B0%E5%BD%95/</guid>
        <description>&lt;p&gt;配置 python&lt;/p&gt;
&lt;p&gt;安装了 python2 后默认可以使用命令&lt;code&gt;python2&lt;/code&gt; 来执行操作，但是一些脚本使用的是&lt;code&gt;python&lt;/code&gt;，所以这样会导致脚本执行错误：&lt;code&gt;python: command not found&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这样就需要我们&lt;code&gt;python&lt;/code&gt;关联到&lt;code&gt;python2&lt;/code&gt;上面。我们可以借助&lt;code&gt;update-alternatives&lt;/code&gt;来实现。&lt;/p&gt;
&lt;p&gt;比如上面的情况，我们可以设置命令如下。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo update-alternatives --install /usr/bin/python python /usr/bin/python2 1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 2
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;这里面的 python3 看情况而定，这里只是演示。&lt;/p&gt;
&lt;p&gt;接着我们就可以使用命令切换我们需要使用的版本了。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo update-alternatives --config python
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;配置-java&#34;&gt;配置 Java
&lt;/h3&gt;&lt;p&gt;同样我们也可以如法炮制来配置&lt;code&gt;jdk&lt;/code&gt;的版本。&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 1
sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-11-openjdk-amd64/bin/java 2
​
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;接着选择我们使用的版本即可。&lt;/p&gt;
&lt;p&gt;sudo update-alternatives &amp;ndash;config java&lt;/p&gt;
</description>
        </item>
        <item>
        <title>编译 android 源码错误解决记录</title>
        <link>https://a6233.com/posts/%E7%BC%96%E8%AF%91-android-%E6%BA%90%E7%A0%81%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3%E8%AE%B0%E5%BD%95/</link>
        <pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate>
        
        <guid>https://a6233.com/posts/%E7%BC%96%E8%AF%91-android-%E6%BA%90%E7%A0%81%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3%E8%AE%B0%E5%BD%95/</guid>
        <description>&lt;p&gt;1、提示 BaseTools C Tool binary was not found&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;BaseTools C Tool binary was not found (GenFw)
You may need to run:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;可以到提示的目录下，执行 make 编译即可。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>&lt;uses-library&gt; &lt;/uses-library&gt;uses-library &lt;uses-library&gt;标签&lt;/uses-library&gt;作用</title>
        <link>https://a6233.com/posts/uses-library-%E6%A0%87%E7%AD%BE%E4%BD%9C%E7%94%A8/</link>
        <pubDate>Mon, 14 Oct 2024 00:00:00 +0000</pubDate>
        
        <guid>https://a6233.com/posts/uses-library-%E6%A0%87%E7%AD%BE%E4%BD%9C%E7%94%A8/</guid>
        <description>&lt;p&gt;在 &lt;code&gt;AndroidManifest.xml&lt;/code&gt; 文件中，&lt;code&gt;&amp;lt;uses-library&amp;gt;&lt;/code&gt; 标签用于声明应用程序依赖于某个外部库。这些库通常是Android系统提供的可选库，而不是应用自身打包的库。通过声明 &lt;code&gt;&amp;lt;uses-library&amp;gt;&lt;/code&gt;，你可以确保系统在应用安装时检查该库是否可用，并在缺少该库时阻止应用安装或运行。&lt;/p&gt;
&lt;p&gt;常见的用途有依赖某些系统扩展库或平台库，例如 &lt;code&gt;org.apache.http.legacy&lt;/code&gt;，可以通过 &lt;code&gt;&amp;lt;uses-library&amp;gt;&lt;/code&gt; 声明这个依赖关系：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;&amp;lt;uses-library
    android:name=&amp;#34;org.apache.http.legacy&amp;#34;
    android:required=&amp;#34;false&amp;#34; /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;属性解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;android:name&lt;/code&gt;: 指定依赖库的名称。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;android:required&lt;/code&gt;: 可选属性，默认为 &lt;code&gt;true&lt;/code&gt;，表示该库是必需的。如果设置为 &lt;code&gt;false&lt;/code&gt;，即使设备上没有该库，应用仍然可以运行，只不过相关功能可能无法使用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个声明在处理不同版本的系统或与系统扩展库集成时非常有用。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
