我将许多纹理加载到(Open GL)应用程序(内存中未压缩的数百兆字节)中,因此我使用LRU缓存并在需要时丢弃它们.在Android中,Open GL纹理在本机堆中分配,因此我可以使用所有可用内存.
问题是......
ActivityManager activityManager = (ActivityManager)VhbApplication.getInstance().getSystemService(Context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(memoryInfo);
memoryInfo.availMem
Run Code Online (Sandbox Code Playgroud)
在availMem报告在某些设备上奇异数:银河标签10.1 3.2 - 160MiB和系统显示300MiB免费,宏基ICONIA TAB A200与4.0.3报告可用内存作为系统〜400MiB相同的值.第二个问题是,宏碁,我得到了内存不足的错误(不OutOfMemoryError错误的形式,可以被捕获为异常.然后它就击中SIGSEGV)分配尺寸小于200MiB的纹理也是如此.并非总是如此,但如果应用程序运行足够长的时间,一些纹理从缓存中删除,新的加载,那么应用程序可能会崩溃.
所以我无法以非常强大的方式设置缓存大小.那些随机的OOM崩溃只与宏碁有关.我喜欢的Galaxy Tab 10.1,的Nexus 7,甚至GALAXY NOTE(5" )我得到这些随机崩溃的其他设备.我正常删除的Open GL纹理.
Acer是否有一些限制在他们的Androids中,不仅限制了VM内存大小,还限制了本机堆分配?或者它是一个有缺陷的Open GL驱动程序?Acer和Galaxy标签使用几乎相同的Tegra 2 GPU.
如何可靠地设置缓存大小?我需要至少100MiB.或者以其他方式将100-200 MiB的纹理强大地分配到Android Open GL应用程序中?
我正在使用 Retrofit 2 库版本 2.3.0,突然间它开始用零代替实际数字替换整数路径参数。
我正在使用 Kotlin (1.2.21) 并且我有一个类似的方法:
@GET("posts/{postId}")
fun getPosts(@Path("postId") postId: Long): Single<Post>
Run Code Online (Sandbox Code Playgroud)
这可以正常工作,但是现在当我在 Android 6(设备和模拟器)上运行我的应用程序时,postId路径参数始终为零,即被posts/0调用。Android 7 和 8 很好。Retrofit 和 OkHttp 版本没有变化,界面也没有变化。
我查看了构建的请求,OkHttpCall内部有args一个类型Long为 0 的值的数组。这仅在 Android 6 上,其他人在那里有正确的值。该ServiceMethod在界面的正确URL集,它有一个ParameterHandler对postId类型BuiltInConverter.ToStringConverter。
应用程序是 multiDexed 并且不使用 ProGuard。会发生什么?
我正在制作一个应用程序,当手机连接到 Android Auto 时,它应该改变其行为。它不具有任何汽车功能,并且不会作为 Android Auto 应用程序进行营销/提交。
有没有办法检测手机是否连接到 Android Auto?我知道汽车媒体应用程序可以通过BroadcastReceiver注册com.google.android.gms.car.media.STATUS操作来检测其连接状态。该文档并非 100% 清晰,那么这是否也适用于所有其他非汽车应用程序?
我想删除重复的代码,所以我想创建一个简单的 MVP 基础视图控制器,它将模型、视图和演示者类型联系在一起并自动连接它们,例如:
class BaseMvpViewController<M: MvpModel, V: MvpView, P: MvpPresenter>: UIViewController {
Run Code Online (Sandbox Code Playgroud)
我的模型和视图是空协议的地方:
protocol MvpModel {}
protocol MvpView: class {} // class is needed for weak property
Run Code Online (Sandbox Code Playgroud)
主持人看起来像这样:
protocol MvpPresenter {
associatedtype View: MvpView
weak var view: View? { get set }
func onAttach(view: View)
func onDetach(view: View)
}
Run Code Online (Sandbox Code Playgroud)
这是我的全部BaseMvpViewController:
class BaseMvpViewController<M: MvpModel, V, P: MvpPresenter>: UIViewController, MvpView {
typealias View = V
var model: M? = nil
var presenter: P!
required public init?(coder aDecoder: NSCoder) {
super.init(coder: …Run Code Online (Sandbox Code Playgroud) 我在Go和Swift中有应用程序处理字符串,例如查找子字符串及其索引.起初它甚至可以使用多字节字符(例如表情符号),使用Go utf8.RuneCountInString()和Swift的原生字符串.
但是有一些UTF8字符可以打破字符串长度和子字符串的索引,例如字符串"Lorem ?? ipsum":
Go的utf8.RuneCountInString("Lorem ?? ipsum")返回17,起始索引ipsum为12.
Swift的"Lorem ?? ipsum".count返回16,起始索引ipsum为11.
使用Swift String utf8,utf16或者使用cast来NSString提供不同的长度和索引.还有其他表情符号由多个其他表情符号组成,它们提供更有趣的数字.
这是Go 1.8和Swift 4.1.
有没有办法用Go和Swift获得相同的字符串长度和子字符串索引?
编辑
我基于@ MartinR的答案创建了一个Swift String扩展:
extension String {
func runesRangeToNSRange(from: Int, to: Int) -> NSRange {
let length = to - from
let start = unicodeScalars.index(unicodeScalars.startIndex, offsetBy: from)
let end = unicodeScalars.index(start, offsetBy: length)
let range = start..<end
return NSRange(range, in: self)
}
}
Run Code Online (Sandbox Code Playgroud)