找不到新的Android架构组件的源代码.它发表了吗?如果是的话,在哪里?
如果源是在AOSP中,请指定我应该使用哪个特定的repo项目repo sync [PROJ_NAME]
才能获得它.
我几个月来一直在为Android开发,这个问题一次又一次地出现:添加全新功能(API)以支持库而没有它们在标准SDK中可用的动机是什么?
例:
FragmentTabHost API仅可通过android.support.v4.app.FragmentTabHost
.大部分时间都很好,但是如果你想将片段嵌套和PreferenceFragment一起使用,你就会死在水中 - 嵌套需要你切换到android.support.v4.app.Fragment
(支持4.2以下),但是在这里没有PreferenceFragment的实现支持lib.因此,您要么实现自定义解决方法,要么使用已经实现它们的第三方库(请参阅此问题)
编辑:正如@eugen在他的回答中指出的那样,我自己从support-v13引用了FragmentTabHost,它支持原生片段.但是,此信息不会改变整体问题.事实上,如果我将此API与片段嵌套一起使用,我的应用程序今天将无法在~30%的设备上运行(本机片段支持从4.2开始嵌套).
例:
我今天遇到的另一个问题(浪费了太多时间)是通过ActionBarDrawerToggle提供的android.support.v7.app.ActionBarDrawerToggle
.我想使用此功能,因此我将整个添加com.android.support:appcompat-v7:21.0.+
到项目的依赖项中.我猜这会做,但我错了 - 我的应用程序没有编译(缺少支持库引用的资源).在从网上尝试了一些技巧之后,我发现这个问题最终提供了解决方案.简而言之:v7支持库依赖于SDK,因此我不得不定义compileSdkVersion 21
.
后果:
现在,我告诉自己:FragmentTabHost尚未添加到任何SDK版本中,这意味着即使是4到5年后,开发人员仍将继续使用support-v4 lib来提供此功能(因为即使今天添加了此API) ,你可以安全地假设所有目标设备本地支持它,需要几年时间,对吧?相同的参数适用于android.support.v4.widget.DrawerLayout
仅存在于支持库中的API和其他API.
如果开发人员多年来一直使用支持库,这也意味着他们在这些问题已经解决之后很久就会遇到上述不一致/依赖问题,对吧?
题:
谷歌为什么要永远保留这些图书馆?如果将所有新API与兼容库并行添加到SDK中,那么对于每个人来说都不会更好,这样兼容性库可能会老化并在某些时候"退出"吗?
编辑:关注@ eugen的回答我现在更加困惑 - 一些API"升级"了更新的支持库,但是没有进入主SDK(比如FragmentTabHost,它从support-v4演变为support-v7).不将它们添加到SDK的原因是什么?
ViewModel
如果以下列方式使用,新类的实例可以在配置更改后继续存在:
mViewModel = ViewModelProviders.of(this).get(MyViewModel.class);
Run Code Online (Sandbox Code Playgroud)
但是,除了配置更改之外,还有一个保存还原方案,当整个应用程序的进程被终止时.
ViewModel
在保存还原方案中,是否会保留字段内的值?
编辑:根据这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous
android viewmodel view-model-pattern android-viewmodel android-architecture-components
最近,我的一位同事说了这样的话:"构建服务器从同一源代码生成的连续APK(可执行文件)可能不一样".此讨论的上下文是在构建X上执行的QA是否也适用于构建Y,它由相同的源代码由相同的构建服务器(以相同方式配置)执行.
我认为由于各种因素(例如,不同的时间戳),生成的可执行文件可能不完全相同,但问题是它们是否可以在功能上不同.
我能想到的唯一情况是,相同的源代码可以产生不同的功能,这就是多线程问题:在多线程代码同步不正确的情况下,在编译时执行不同的重新排序/优化操作可能会影响这个不良同步的代码并改变其功能行为.
我的问题是:
任何相关材料的链接将不胜感激.
我从服务器上获得了一段纯HTML文本,需要在我的应用程序中呈现它,但并非全部.
我还需要检测文本中特定短语的点击次数.短语由两个数字定义:短语开始的单词计数和单词结束的单词计数(例如,从单词10到单词15).
我的直觉说我可以根据短语规范用链接或一些JavaScript来检测HTML,然后听取这些链接的点击.但是,我不确定如何在Android中实现这种功能.
此外,我还需要能够以编程方式观察和操纵所显示的HTML文本中的滚动位置.例如,我需要了解何时在屏幕上滚动特定短语.
我想我有三个密切相关的问题:
TextView
,WebView
,等)?谢谢
观察到Android应用程序的这种非常奇怪的行为。大概情况:
附加信息:
我想我有两个问题:
编辑(更多信息):
/data/app/com.myapp-2/base.apk
,/data/app/com.myapp-3/base.apk
,等。我目前的假设是电池耗尽会导致平板电脑“重置”其状态(例如,时钟也会重置),并且在再次通电时,它会混淆应用的APK之间并加载错误的APK。
但是,我不知道为什么会这样做,或者如何防止这种行为。
我使用GitHub的Immutables库进行Android开发,现在我想在后端方面尝试一下.
在Android中,为了使用该库,我需要的是:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
// immutable entities generation
provided "org.immutables:value:2.5.5" // for annotations
provided "org.immutables:builder:2.5.5" // for annotations
provided "org.immutables:gson:2.5.5" // for annotations
... other dependencies
}
Run Code Online (Sandbox Code Playgroud)
当我尝试将上述依赖项复制到build.gradle
我的Java项目中时,我收到此错误:
Error:(24, 0) Gradle DSL method not found: 'provided()'
Run Code Online (Sandbox Code Playgroud)
我试图provided
用compileOnly
和替换compile
,但是然后@Value.Immutable
没有生成带注释的接口的实现.
我如何使其工作?
有问题的程序在Android上运行时控制从属蓝牙(BT)设备.它具有几个按钮,可以启用对等设备的不同功能.
默认情况下,Android设备上未启用蓝牙,并且在按钮单击后短时间内建立连接.
因此,每次点击按钮后的流程为:
startActivityForResult()
如果没有BT启用意图)我的问题是,如果没有启用BT,那么startActivityForResult()
在#1中的调用会"打破"程序流程.后来,当onActivityResult()
被调用时,我想从"被打破"的点恢复流程.
为此,我定义了额外的成员字段和几个常量,并将它们用于onActivityResult()
:
private int mRerunMethodIndex = 0;
private static final int RERUN_METHOD1 = 1;
private static final inr RERUN_METHOD2 = 2;
...
public void onActivityResult(int requestCode, int resultCode, Intent data) {
switch (requestCode) {
case REQUEST_ENABLE_BT:
if (resultCode == Activity.RESULT_OK) {
int rerunMethodIndex = mRerunMethodIndex;
mRerunMethodIndex = 0;
switch (rerunMethodIndex ) {
case (RERUN_METHOD1):
method1();
break;
case (RERUN_METHOD2):
method2();
break;
// ... the same for …
Run Code Online (Sandbox Code Playgroud) 我安装了Apache Shiro 1.4.0,并按照这个官方教程进行设置.
当我尝试使用教程中的代码进行初始化SecurityUtils
时SecurityManager
:
Factory<SecurityManager> factory = new IniSecurityManagerFactory("classpath:shiro.ini");
SecurityManager securityManager = factory.getInstance();
SecurityUtils.setSecurityManager(securityManager);
Run Code Online (Sandbox Code Playgroud)
我收到的消息IniSecurityManagerFactory
现在已被弃用,有利于Shiro的Environment
.
我找不到任何教程来演示如何初始化Shiro使用Environment
,其文档没有多大帮助:
Environment实例封装了Shiro运行所需的所有对象.它本质上是一个"元"对象,从中可以为应用程序获取所有Shiro组件.
通常在解析Shiro配置文件时创建Environment实例.环境实例可以存储在应用程序认为必要的任何位置,并且可以从中检索实现安全行为可能需要的任何Shiro组件.
例如,通过Environment实例可访问的最明显的组件是应用程序的securityManager.
那么,我该如何使用这种新的初始化机制呢?
协程Dispatchers.IO
上下文限制为 64 个线程。这不足以在高并发系统中可靠地与阻塞代码交互。
文档指出:
该池中的其他线程被创建并按需关闭。此调度程序使用的线程数受“kotlinx.coroutines.io.parallelism”(IO_PARALLELISM_PROPERTY_NAME)系统属性值的限制。它默认为 64 个线程的限制或内核数(以较大者为准)。
我想将kotlinx.coroutines.io.parallelism
系统属性更改为其他内容。但是,如果我只是这样做:
adb shell "setprop kotlinx.coroutines.io.parallelism 1000"
Run Code Online (Sandbox Code Playgroud)
然后我得到以下结果:
setprop: failed to set property 'kotlinx.coroutines.io.parallelism' to '1000'
Run Code Online (Sandbox Code Playgroud)
此外,如果我想发布我的应用程序,那么我还需要在用户设备上更改此属性,对吗?否则应用程序将无法运行。但是,即使假设有可能,据我所知,所有更改此属性的应用程序都将覆盖彼此的设置。这听起来不像是一种可靠的操作模式。
所以,在这种情况下,我有三个问题:
PS 我知道如果我只使用协程而不阻塞代码,这不会是一个问题(可能)。但是让我们假设我需要使用阻塞调用(例如遗留 Java 代码)。