小编Men*_*ena的帖子

Android Alarm Manager setExactAndAllowWhileIdle()在Doze模式下无法在Android 7.0 Nougat中运行

我试图使用Alarm Manager每隔30分钟在我的应用程序中发出警报,setExactAndAllowWhileIdle但它无法正常工作!

每当收到报警信号时,我都会通过发出推送通知来测试功能.

问题是:当设备闲置一段时间后进入打盹模式时,我不再收到警报.但是,只要我打开屏幕,我就会收到通知.我的应用程序需要准确的警报,需要每30分钟准确按时交付!由于设备处于打盹模式,它无法接收延迟警报或丢失警报!

我在我的代码中使用了以下内容:

  1. 我在打开应用程序时设置闹钟.
  2. 我使用WakefulBroadcastReceiver接收警报信号.在它的 onReceive()方法中,我设置下一个警报.我也是,启动一个只发出推送通知的startWakefulService,然后自行停止.
  3. 我在onReceive()的末尾调用completeWakefulIntent.
  4. 我尝试了两种方法:RTC_WAKEUP和ELAPSED_REALTIME_WAKEUP

笔记:

  • wakefulbroadcastReceiver类在Manifest中注册.
  • 我添加了权限: android.permission.WAKE_LOCK
  • 我试过White-Listing我的应用程序,但结果是一样的
  • 我尝试使用setAlarmClock()它甚至在打盹模式下一直工作,每50个警报一个丢弃/延迟警报.所以,它也不完美.而且我不希望用户一直看到警报图标.
  • 在打盹期间,setExactAndAllowWhileIdle()不仅不起作用,而且在它工作时也具有可怕的准确性.我通常会
    在1-3分钟后或1-3分钟前收到很多警报信号.
  • 我正在使用华为Mate 8和android 7.0 Nougat进行测试.

PS: 在回答之前,请确保您了解从Android 6.0 M和Doze模式开始施加的限制.

Link1:https://developer.android.com/training/monitoring-device-state/doze-standby.html

总之它说:

  • 如果需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle().
  • 使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze.

现在,为什么我不能每30分钟使用setExactAndAllowWhileIdle()?获得准确的报警信号?而且,为什么不是setAlarmClock()100%可靠?!

android android-intent android-alarms android-doze android-7.0-nougat

16
推荐指数
2
解决办法
4420
查看次数

改进OKHTTP离线缓存无法正常工作

我阅读了几十个教程和Stackoverflow对我的问题的答案,但没有什么对我有用!此外,他们中的大多数都是旧的,所以OKHTTP可能会以某种方式改变.

我想要的只是为Retrofit 启用离线缓存.

我正在使用GET

我曾尝试仅用offlineCacheInterceptor作拦截器,但我一直得到:

Unable to resolve host "jsonplaceholder.typicode.com": No address associated with hostname
Run Code Online (Sandbox Code Playgroud)

我尝试使用offlineCacheInterceptorInterceptor + provideCacheInterceptor()作为NetworkInterceptor的组合,但我一直得到:

504 Unsatisfiable Request (only-if-cached) and a null response.body()
Run Code Online (Sandbox Code Playgroud)

我甚至确保.removeHeader("Pragma")到处添加!


我尝试了所有这些链接:

https://newfivefour.com/android-retrofit2-okhttp3-cache-network-request-offline.html (一个拦截器,不工作!!)

https://medium.com/mindorks/caching-with-retrofit-store-responses-offline-71439ed32fda(一个拦截器,不工作!)

https://caster.io/lessons/retrofit-2-offline-cache(单独在线+离线缓存,不工作)

https://www.journaldev.com/23297/android-retrofit-okhttp-offline-caching(不工作,504不满意请求(仅限缓存))

http://mikescamell.com/gotcha-when-offline-caching-with-okhttp3/(一个拦截器,不工作!!)

/sf/answers/3380677821/(不工作)无法解析主机"jsonplaceholder.typicode.com":没有与主机名关联的地址

使用OKHttp进行改造可以在离线时使用缓存数据 (令人困惑!)


这是我的代码:

public static Retrofit getRetrofitInstance(Context context) {
        if (retrofit == null) {
            c = context;
            int cacheSize = 10 * 1024 * 1024; // 10 MB
            Cache cache = …
Run Code Online (Sandbox Code Playgroud)

android caching retrofit retrofit2 okhttp3

4
推荐指数
1
解决办法
2160
查看次数

与 Livedata 不同,使用 Flow in Room 查询在更新表条目时不会触发刷新,但在删除或插入条目时会起作用

当使用 Livedata 作为 Room 中表上的 select* 查询的返回类型时,然后我观察它,如果我更新/插入/删除该表中的条目,我会得到触发器。然而,当我尝试使用 Kotlin Flow 时,我只得到 2 个触发器。

第一个触发器给出一个空值,因为状态流的初始值为空。第二个触发器是 Room 表中的条目列表。

如果我对数据库执行插入/删除操作,我会收到来自 StateFlow 的触发器。但是,如果我更新条目,Stateflow 不会触发。

注意:更新操作在数据库上正常工作。我使用 DB 检查器进行了检查。

数据类和 DAO

@Entity
data class CartItem (
    @PrimaryKey
    val itemId: Int,
    var itemQuantity: Int=1
)

@Dao
interface CartDao {

    @Query("SELECT * FROM CartItem")
    fun getAllItems(): Flow<List<CartItem>>

    @Update
    suspend fun changeQuantityInCart(cartItem:CartItem)

    @Insert
    suspend fun insert(item: CartItem)

    @Delete
    suspend fun delete(cartItem:CartItem)
}
Run Code Online (Sandbox Code Playgroud)

视图模型

val cartItems: StateFlow<List<CartItem>?> =
        repo.fetchCartItems().stateIn(viewModelScope, SharingStarted.Lazily, null)
Run Code Online (Sandbox Code Playgroud)

分段

viewLifecycleOwner.lifecycleScope.launchWhenStarted {
            viewModel.cartItems.collect {
              Log.e("Update","Update")
 }
Run Code Online (Sandbox Code Playgroud)

android android-room kotlin-flow kotlin-stateflow

4
推荐指数
1
解决办法
3727
查看次数

ValueError:期望 x 为非空数组或数据集(Collab 上的 Tensor Flow lite 模型制造商)

我下面这个关于创建使用TensorFlow精简版上的协同合作模型制作自定义模型教程。

import pathlib
path = pathlib.Path('/content/employee_pics') 
count = len(list(path.glob('*/*.jpg')))
count

data = ImageClassifierDataLoader.from_folder(path)
train_data, test_data = data.split(0.5)
Run Code Online (Sandbox Code Playgroud)

我有第 2 步的问题:

model = image_classifier.create(train_data)
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:ValueError: Expect x to be a non-empty array or dataset。

在此处输入图片说明

难道我做错了什么?不过,示例中提供的数据集运行良好。为什么?

keras tensorflow tensorflow-lite tf.keras google-mlkit

3
推荐指数
2
解决办法
8292
查看次数