小编she*_*lll的帖子

分配本机内存时内存不足

我将许多纹理加载到(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应用程序中?

android memory-management native opengl-es

5
推荐指数
0
解决办法
649
查看次数

Android 6 上的 Retrofit 2 设置零路径参数

我正在使用 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集,它有一个ParameterHandlerpostId类型BuiltInConverter.ToStringConverter

应用程序是 multiDexed 并且不使用 ProGuard。会发生什么?

android kotlin retrofit2

5
推荐指数
1
解决办法
1608
查看次数

如何检测手机是否连接到 Android Auto

我正在制作一个应用程序,当手机连接到 Android Auto 时,它应该改变其行为。它不具有任何汽车功能,并且不会作为 Android Auto 应用程序进行营销/提交。

有没有办法检测手机是否连接到 Android Auto?我知道汽车媒体应用程序可以通过BroadcastReceiver注册com.google.android.gms.car.media.STATUS操作来检测其连接状态。该文档并非 100% 清晰,那么这是否也适用于所有其他非汽车应用程序?

android android-auto

3
推荐指数
1
解决办法
5003
查看次数

Swift 如何创建像 UIViewController 这样的通用 MVP

我想删除重复的代码,所以我想创建一个简单的 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)

generics mvp ios swift

2
推荐指数
1
解决办法
2789
查看次数

UTF8字符串长度和Go vs Swift中的索引

我在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)

string utf-8 go swift

0
推荐指数
1
解决办法
214
查看次数