我安装了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.
那么,我该如何使用这种新的初始化机制呢?
我的应用程序中有一个DialogFragment
( android.support.v4.app.DialogFragment
)的子类,它可以正常工作很长时间。对话框本身是在onCreateDialog()
回调中构造的。
但是,现在我想转换到新的对话框布局并决定构建一个完全自定义的对话框。据我所知,这需要删除回调中onCreateDialog()
的View
层次结构的覆盖和膨胀onCreateView()
。我这样做了。
由此产生的行为很奇怪——当需要显示对话框时,屏幕变暗,但没有显示对话框的布局(“后退”按钮的行为也与对话框的功能一致):
我试图恢复到旧的实现(使用onCreateDialog()
回调) - 它仍然有效。
我的问题是:我做错了什么?
对话框的代码:
/**
* A dialog that can show title and message and has two buttons. User's actions performed
* in this dialog will be posted to {@link EventBus} as {@link PromptDialogDismissedEvent}.
*/
public class PromptDialog extends BaseDialog {
/* package */ static final String ARG_TITLE = "ARG_TITLE";
/* package */ static final String ARG_MESSAGE = "ARG_MESSAGE";
/* package */ …
Run Code Online (Sandbox Code Playgroud) 我想使用Glide急切下载图像并将其缓存在磁盘上以备将来使用。我想从后台线程调用此功能。
我已经阅读了Glide的缓存文档,但是并没有说明如何在没有实际目标的情况下下载图像。然后,我发现了这个问题,并尝试使用类似的方法,但是无论如何,我都会遇到此异常:
java.lang.IllegalArgumentException: You must call this method on the main thread
Run Code Online (Sandbox Code Playgroud)
那么,如何告诉Glide从后台线程缓存图像?
编辑:我真的很想在后台线程上调用Glide的方法。我知道我可以使用Handler和其他方式将其卸载到UI线程,但这不是我要的。
Kotlin协程是否提供任何“事前保证”?
例如,mutableVar
在这种情况下,对(可能)其他线程的写入和后续读取之间是否存在“先于后继”保证:
suspend fun doSomething() {
var mutableVar = 0
withContext(Dispatchers.IO) {
mutableVar = 1
}
System.out.println("value: $mutableVar")
}
Run Code Online (Sandbox Code Playgroud)
编辑:
也许其他示例可以更好地阐明这个问题,因为它更具Kotlin风格(可变性除外)。这段代码是线程安全的吗:
suspend fun doSomething() {
var data = withContext(Dispatchers.IO) {
Data(1)
}
System.out.println("value: ${data.data}")
}
private data class Data(var data: Int)
Run Code Online (Sandbox Code Playgroud) 我想在 find-file 命令中使用环境变量。像这样的东西:
C-x C-f $ENV_VAR/foo.txt
find-file 有这个功能吗?语法是什么?
为了实现具有独立且可重用的UI组件的干净架构,我需要具有嵌套的层次结构FrameLayouts
(最多3-4个嵌套FrameLayouts
),所有这些都具有layout_width
并layout_height
设置为match_parent
(在该答案中描述了该体系结构背后的一般概念)).
我开始怀疑这种嵌套方法是否存在明显的性能开销FrameLayouts
.为了使问题不那么抽象,让我们在两个具体层次结构的上下文中讨论它:"静态"层次结构(屏幕上没有任何移动)和"可滚动"层次结构(用户可以滚动屏幕).
"静态"层次结构:
一旦显示包含此层次结构的屏幕,则不再发生任何变化.
"可滚动"层次结构:
在屏幕上显示此层次结构后,用户可以滚动内部ListView
,因此需要重新绘制最内层RelativeLayouts
.
我并不担心"静态"层次结构 - FrameLayouts
在这种情况下嵌套的开销是一次性的,并且不会以任何明显的方式影响布局的性能.
那么"可滚动"布局呢?我想知道内部ListView
是否被包裹的事实是否FrameLayouts
会影响其滚动性能......
FrameLayouts
影响嵌套ListView
滚动性能吗?我们都知道ContentResolver
不应在 UI 线程上执行查询,但令人惊讶的是,我ContentResolver
在官方文档中找不到有关类线程安全的信息。
我知道如何编写 thread-safe ContentProvider
,并且我知道SQLite
默认情况下它是线程安全的(它实现了内部锁定机制)。
但是,使用ContentResolver
来自多个线程的单个实例是否安全(例如,两个线程调用insert()
或query()
在同一对象上并行)?
multithreading android thread-safety android-contentresolver
为了在启动时初始化应用程序,我扩展了ServletContextListener
:
@WebListener
public class MyServletContextListener implements javax.servlet.ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
... initialization code here
}
@Override
public void contextDestroyed(ServletContextEvent sce) {}
}
Run Code Online (Sandbox Code Playgroud)
现在我想将初始化逻辑提取到一个独立的StartupManager
类中,并从MyServletContextListener
以下委托给这个类:
public class StartupManager {
public void performStartup() {
... initialization code here
}
}
Run Code Online (Sandbox Code Playgroud)
我试图注入StartupManager
到ServletContextListener
通过简单地添加@Inject
注释:
@WebListener
public class MyServletContextListener implements javax.servlet.ServletContextListener {
@Inject StartupManager mStartupManager;
@Override
public void contextInitialized(ServletContextEvent sce) {
mStartupManager.performStartup();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用 …
我正在构建一个应用程序,在该应用程序中准确搜索MP3文件非常重要。
目前,我以以下方式使用ExoPlayer:
public void playPeriod(long startPositionMs, long endPositionMs) {
MediaSource mediaSource = new ClippingMediaSource(
new ExtractorMediaSource.Factory(mDataSourceFactory).createMediaSource(mFileUri),
startPositionMs * 1000,
endPositionMs * 1000
);
mExoPlayer.prepare(mediaSource);
mExoPlayer.setPlayWhenReady(true);
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,此方法会导致相对于预期播放时间的1-3秒偏移。
我在ExoPlayer的github上发现了这个问题。看起来这是Mp3格式的ExoPlayer的固有限制,不会被修复。
我还发现了这个问题,似乎表明Android的本地MadiaPlayer和MediaExtractor中存在相同的问题。
有没有一种方法可以在Android上的本地(例如设备上)Mp3文件中执行精确查找?我非常乐意接受任何破解或解决方法。
我刚刚将我的 Android 库从 JCenter 迁移到了 MavenCentral。该过程成功完成,我可以通过Sonatype Repo Search找到我的库。
但是,当我尝试在示例应用程序中使用 lib 时,出现以下错误:
Execution failed for task ':sample:checkDebugAarMetadata'.
> Could not resolve all files for configuration ':sample:debugRuntimeClasspath'.
> Could not find :unspecified:.
Required by:
project :sample > com.techyourchance:threadposter:1.0.0
Possible solution:
- Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html
Run Code Online (Sandbox Code Playgroud)
看起来 Gradle 找到了我的库(因为如果我更改为不存在的版本,比如 2.0.0,那么我会得到完全不同的错误),但是工件存在一些问题。
所有源代码(包括 lib 和示例应用程序)都可以在这里找到。具体来说,这里是lib 的build.gradle,这是处理发布到 Sonatype的附加 Gradle 脚本。
我已经花了两个小时在 Internet 上搜索上述每个错误消息,但到目前为止无法解决此问题。