该resValue方法(或其任何名称)允许您在或中设置资源值. 是否有相应的方法来获取由?设置的资源值?buildTypesproductFlavorsresValue
它似乎productFlavors在之前进行了评估buildTypes,因此resValue设置buildTypes优先.我想在调试版本中将"Debug"附加到应用程序名称,但是我需要获取在产品flavor中设置的值以便附加到它.
编辑:我尝试使用MarcinKoziński建议使用变量,但所有产品口味都在任何构建类型之前进行评估.因此,这不起作用:
android {
String appName = ""
productFlavors {
Foo {
appName = "Foo"
}
Bar {
appName = "Bar"
}
}
buildTypes {
release {
resValue "string", "app_name", appName
}
debug {
resValue "string", "app_name", appName + " Debug"
}
}
}
Run Code Online (Sandbox Code Playgroud)
在buildTypes,appName始终具有最后一个产品风味的价值.因此,在此示例中,所有构建都接收名称"Bar"或 …
我想创建一个enum每个常量Map与之关联的位置.我完成了这个,给每个常量一个实例初始化器,如下所示:
import java.util.HashMap;
import java.util.Map;
public enum Derp {
FOO {{
mMap.put("bar", 1);
}};
// cannot be private
protected final Map<String, Integer> mMap = new HashMap<>();
}
Run Code Online (Sandbox Code Playgroud)
我发现如果mMap是private,则无法在实例初始化程序中引用它.错误是Cannot make a static reference to the non-static field mMap.在我发生这种情况之前,我咨询了JLS§8.9.2,其中部分说:
对于构造函数,实例初始化程序块或枚举常量的实例变量初始化程序表达式来说,它是一个编译时错误,它
e指向e或向右侧声明的相同类型的枚举常量e.
我是不是通过FOO在FOO自己的实例初始化器中隐式引用来打破这个规则?这是如何编译的?它不仅可以编译,而且可以在运行时正常工作.
(在我看来,这mMap不是private因为我隐式创建了一个匿名子类,它不能引用private其超类中的字段.由于枚举是隐含的,因此本身有点奇怪final......)
我只是碰到了一篇文章,这篇文章提出了我以前从未听过的声明,但在其他任何地方都找不到.声明是从另一个线程的角度来看,构造函数返回的值的赋值可以相对于构造函数内的指令重新排序.换句话说,声明是在下面的代码中,另一个线程可以读取尚未设置a值的非空值x.
class MyInt {
private int x;
public MyInt(int value) {
x = value;
}
public int getValue() {
return x;
}
}
MyInt a = new MyInt(42);
Run Code Online (Sandbox Code Playgroud)
这是真的?
编辑:
我认为从线程执行的角度来看,保证MyInt a = new MyInt(42)了赋值与赋值的x发生关系a.但是这两个值都可以缓存在寄存器中,并且它们可能不会按照它们最初写入的顺序刷新到主存储器.没有内存屏障,另一个线程因此可以在写入值a之前读取值x.正确?
因此,基于axtavt的答案和随后的评论,这些线程安全评估是否正确?
// thread-safe
class Foo() {
final int[] x;
public Foo() {
int[] tmp = new int[1];
tmp[0] = 42;
x = tmp; // memory …Run Code Online (Sandbox Code Playgroud) 在我多年的第一个PHP脚本中,我正在尝试记录错误:
error_log("my error message", 3, $error_log);
Run Code Online (Sandbox Code Playgroud)
我在一般Apache错误日志中收到错误:
PHP警告:error_log(/var/log/apache2/my_php_errors.log):无法打开流:第88行/var/www/html/blahblah/my_script.php中的权限被拒绝
这是我检查和尝试过的:
$error_log使用与Apache错误日志相同的所有权(root.adm)和权限(640)创建.www-data,即PHP正在运行的用户.log_errors是On.open_basedir 没有设定.我错过了什么?
编辑:它能够写入常规Apache错误日志.神秘之处在于它无法写入具有相同所有权和权限的同一目录中的另一个文件.
编辑2:另一位开发人员告诉我,这适用于他的WAMP,因此它是我的LAMP堆栈或配置特有的.
我知道你可以安全地发布一个非线程安全的对象,方法是将一个final或一个volatile字段的引用写入,稍后将被其他一个线程读取,前提是在发布时,创建该对象的线程会丢弃对它的引用,以便它不能再干扰或不安全地观察对象在另一个线程中的使用.
但在这个例子中,没有显式final字段,只有final局部变量. 如果调用者丢弃其引用unsafe,这是安全的出版物吗?
void publish(final Unsafe unsafe) {
mExecutor.execute(new Runnable() {
public void run() {
// do something with unsafe
}
}
}
Run Code Online (Sandbox Code Playgroud)
我发现了一些Q&As,就像这个一样,暗示final局部变量被隐式"复制"到匿名类中.这是否意味着上面的例子等同于此?
void publish(final Unsafe unsafe) {
mExecutor.execute(new Runnable() {
final Unsafe mUnsafe = unsafe;
public void run() {
// do something with mUnsafe
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑以澄清:
Unsafe 可能是什么,但说它是这样的:
public class Unsafe {
public int x;
}
Run Code Online (Sandbox Code Playgroud)
并且mExecutor是满足合同的任何东西Executor.
我正在使用依赖的开源库org.json:json:20090211.显然20090211,Android和版本之间存在一些API差异.当我启用ProGuard最小化时,我看到此警告:
警告:com.esri.core.geometry.JSONObjectEnumerator:在库类org.json.JSONObject中找不到引用的方法'java.lang.String [] getNames(org.json.JSONObject)'
该方法存在于当前的参考实现中JSONObject,因此我假设它在版本之前的某个时间添加20090211,而不是在它之后删除,这意味着Android中包含的版本较旧.我想对这个版本进行区分,20090211看看需要做些什么才能使依赖于20090211与Android兼容的库.
Android中包含哪个版本的org.json?
(我知道我可以重命名org.json并将依赖项更改为重命名的版本,但是如果可能的话我想避免这种情况.这样的更改不太可能被上游接受.)
客户抱怨音频插孔MSR不起作用.他们发给我的日志中没有任何内容可以清楚地指出问题可能是什么.但是有一些可疑项目可能会或可能不会相互关联或与MSR的问题相关.我想知道这些东西意味着什么,所以我可以把它们排除在原因之外.
首先,他们发给我的日志包括7分钟,超过630,000行,其中580,000行:
08-05 10:37:56.042 D/RestrictionPolicy( 788): isAudioRecordAllowed : true
这可以达到每秒超过一千行垃圾邮件.我能找到的唯一与限制政策相关的是这个,它没有提及音频.我想知道这个垃圾邮件不仅仅是为了解决这个问题,而且还要让它闭嘴.
另一个可疑项目是这样的:
08-05 10:37:49.124 E/DatabaseUtils( 788): java.lang.SecurityException: Permission Denial: get/set setting for user asks to run as user -2 but is calling from user 0; this requires android.permission.INTERACT_ACROSS_USERS_FULL
08-05 10:37:49.124 E/DatabaseUtils( 788): at com.android.server.am.ActivityManagerService.handleIncomingUser(ActivityManagerService.java:12767)
08-05 10:37:49.124 E/DatabaseUtils( 788): at android.app.ActivityManager.handleIncomingUser(ActivityManager.java:1998)
08-05 10:37:49.124 E/DatabaseUtils( 788): at com.android.providers.settings.SettingsProvider.call(SettingsProvider.java:574)
08-05 10:37:49.124 E/DatabaseUtils( 788): at android.content.ContentProvider$Transport.call(ContentProvider.java:256)
08-05 10:37:49.124 E/DatabaseUtils( 788): at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:256)
08-05 10:37:49.124 E/DatabaseUtils( 788): at android.os.Binder.execTransact(Binder.java:351)
08-05 10:37:49.124 E/DatabaseUtils( 788): at …Run Code Online (Sandbox Code Playgroud) 我正在使用运行Android 5.0.1的Nexus 4上的任务锁定API.我的设备所有者应用程序包含两个按钮:"锁定"和"解锁",只需调用startLockTask()和stopLockTask().这真的是它的全部,但是因为有些人坚持看到样板:
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.lockButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startLockTask();
}
});
findViewById(R.id.unlockButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
stopLockTask();
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
任务已锁定时按"锁定"按钮是无害的.但是如果我在没有锁定任务时按下"解锁"按钮,我会得到一个NPE:
02-12 22:58:11.942: E/AndroidRuntime(12888): java.lang.NullPointerException: Attempt to read from field 'android.content.Intent com.android.server.am.TaskRecord.intent' on a null object reference
02-12 22:58:11.942: E/AndroidRuntime(12888): at android.os.Parcel.readException(Parcel.java:1546)
02-12 22:58:11.942: E/AndroidRuntime(12888): at android.os.Parcel.readException(Parcel.java:1493)
02-12 22:58:11.942: E/AndroidRuntime(12888): at android.app.ActivityManagerProxy.stopLockTaskMode(ActivityManagerNative.java:5245)
02-12 …Run Code Online (Sandbox Code Playgroud) 假设我有几个对话框片段,以响应可以按任何顺序到达的消息和事件.通常,显示的最后一个对话框将位于顶部. 有没有办法在现有的对话框片段下显示对话框片段,或者在显示它们后更改它们的z顺序?
我的应用程序一次显示多个对话框应该是非常罕见的,但它可能会发生.有一个特定的对话框,只要它可见就应该始终在顶部.
我有一个使用Dagger2并使用Maven构建的桌面Java项目.我不能运行compile和package顺序.这有效:
$ mvn clean
$ mvn compile
Run Code Online (Sandbox Code Playgroud)
这是有效的,生成一个可以运行而没有错误的可执行jar:
$ mvn clean
$ mvn package
Run Code Online (Sandbox Code Playgroud)
但这失败了:
$ mvn clean
$ mvn compile
$ mvn package
Run Code Online (Sandbox Code Playgroud)
当package到达使用Dagger2的模块时,它输出:
[INFO] Changes detected - recompiling the module!
Run Code Online (Sandbox Code Playgroud)
错误来自mvn -e package:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project weapon: Compilation failure -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.3:compile (default-compile) on project weapon: Compilation failure
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:213)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) …Run Code Online (Sandbox Code Playgroud)