小编Gil*_*les的帖子

调用 REST API 的协程 -> 致命异常:main

我需要从 REST API 获取一些数据,当我连接 4G 或 wifi 时一切正常,但当我处于飞行模式时,应用程序崩溃并显示:“E/AndroidRuntime: FATAL EXCEPTION: main”

在此之前,我有一个日志(不是错误:“跳过了 1013 帧!应用程序可能在其主线程上做了太多工作。”)

所以我认为在没有网络的情况下获取 API 会导致应用程序崩溃,因为它在主线程中运行。但我正在使用协程,对我来说,我做得对:

视图模型

private val viewModelJob = SupervisorJob()
private val viewModelScope = CoroutineScope(viewModelJob + Dispatchers.Main)
init {
        viewModelScope.launch {
            videosRepository.refreshVideos()
        }
    }
Run Code Online (Sandbox Code Playgroud)

存储库

suspend fun refreshVideos() {
        withContext(Dispatchers.IO) {
            val playlist = Network.devbytes.getPlaylist().await()
            //database.videoDao().insertAll(*playlist.asDatabaseModel())
        }
    }
Run Code Online (Sandbox Code Playgroud)

服务

/**
 * A retrofit service to fetch a devbyte playlist.
 */
interface DevbyteService {
    @GET("devbytes.json")
    fun getPlaylist(): Deferred<NetworkVideoContainer>
}

/**
 * Build the Moshi object that Retrofit will …
Run Code Online (Sandbox Code Playgroud)

android kotlin kotlin-coroutines

6
推荐指数
1
解决办法
2449
查看次数

IntelliJ IDEA 2018.2、openjdk 11 和 openjfx 11(无 Maven,不是模块化项目):找不到模块 javafx.controls

我刚刚使用 openjdk 11 在 intelliJ 中创建了一个新的 JavaFX 项目,并在他们的网站上下载了最后一个 openjfx 库。

这是我所做的:

我已添加到运行/调试虚拟机选项:--module-path %PATH_TO_FX% --add-modules=javafx.controls,javafx.fxml 虚拟机选项

我添加了一个新变量 env PATH_TO_FX :PATH_TO_FX=%programfiles%\Java\javafx-sdk-11\lib

所以它编译得很好,但在运行时失败:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module javafx.controls not found
Run Code Online (Sandbox Code Playgroud)

有谁知道我在这里缺少什么?

PS:我已经关注此链接https://openjfx.io/openjfx-docs/#install-javafx

编辑 :

我这里应该有 onpenjfx 库吗?类路径

java javafx intellij-idea openjfx javafx-11

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

onActivityCreated 弃用:如何使用 NavigationComponent 添加片段作为 MainActivity 的观察者

我刚刚看到 onActivityCreated() 将来会被弃用。我尝试实现 LifecycleOwner 和 LifecycleObserver 模式,但我不太确定我在这里做什么。

我正在使用 NavigationComponent,这意味着:

  • 我有一个主活动
  • 我有一个 MainFragment,作为主片段实例化
  • 我有多个片段可以从这个主片段访问

由于某些原因,我需要知道何时从所有这些片段(MainFragment 和子片段)创建活动

从我所看到的到现在,我需要:

  • 在主活动中,getLifecycle().addObserver(new MainFragment()). 并对所有子片段执行此操作(这是冗长的)
  • 在片段中,实现 LifecycleObserver 和
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
private void onCreateEvent() {
    Timber.i("%s MainActivity created", TAG);
}
Run Code Online (Sandbox Code Playgroud)

这似乎运作良好,但我有一些问题:

  1. 语法addObserver(new MainFragment()让我感到不安。看起来我们正在创建一个新的片段实例,而片段通常使用 navGraph 中定义的导航进行实例化。
  2. 正如我之前所说,如果我的 MainFragment 有 10 个子片段,我将不得不声明 11 个观察者?奇怪的
  3. 我是否必须在活动生命周期的某个时刻清除这些观察者?

实现它的正确方法是什么?

编辑 1: 回答为什么我需要知道活动何时创建的问题:我需要这个,因为我需要访问我的 MainActivity 视图模型(new ViewModelProvider(requireActivity()).get(ViewModel.class)。调用requireActivity()getActivity()我需要知道活动何时创建(使用 onActivityCreated() 很容易) )。数据绑定是用我的 MainActivity 和这个视图模型实现的。这个 Activity 的布局托管一个加载器,以显示何时执行网络请求。我可以从 MainFragment 和子片段执行请求。当我从其中一个执行请求时这些片段我需要启用这个加载器视图,当我取回数据时,我需要隐藏这个加载器。是的,所有这些片段都在图表中

android android-lifecycle android-jetpack

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