【问题标题】:run network operations on a thread in a Kotlin library在 Kotlin 库中的线程上运行网络操作
【发布时间】:2021-04-23 00:36:02
【问题描述】:

我正在尝试修复 NetworkOnMainThreadException,这是我的类位于库中

class CoinProvider(private val context: Context, isTestnet: Boolean) {


     val result = URL("http://mylink.com/file.json").readText()
     val result1 = URL("http://mylink.com/file1.json").readText()
    
    private val filename: String = if (!isTestnet) (result) else (result1)

    fun defaultCoins(): CoinResponse {
        return CoinResponse.parseFile(context, filename)
    }
}

当我尝试将此添加到我的班级时

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

StrictMode.setThreadPolicy(policy); 

我收到了这个“期待成员声明”

上面的代码可以添加到项目的 MainActivity 中,但它没有做任何事情,因为我想修复不在项目中的库上的 NetworkOnMainThreadException。

如何解决这个 kotlin 库中的问题?

【问题讨论】:

标签: android android-studio kotlin


【解决方案1】:

哦不。请求网络和查询数据库总是不在 Ui 线程中调用,因为它阻塞了 UI 线程(Ui 线程总是以 16 毫秒时间重绘)。

解决方案:

   Thread(Runnable {
         ...// Something Call 
            }).

这样你需要要么实现一个回调来处理传出的数据,要么使用Handler

解决方案 RxJava:

     Single.fromCallable {
        try {
          /// Something Doing
        } catch (e: IOException) {
            false
        }
    }.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())

使用 RxJava,您可以轻松地使用线程并在 Mainthread 中返回结果,您只需观察输出数据。

解决方案 Kotlin-Coroutines

suspend func getJSON(){
//Something Doing....
}

我的理解可能会帮助您解决问题。

【讨论】:

  • 谢谢,它有效。但现在我收到另一个错误“无法创建应用程序 java.io.FileNotFoundException”我可以看到 Logcat 中的 json 内容意味着该 url 现在是可读的,但似乎无法创建文件 'java.lang.RuntimeException : 无法创建应用程序 .core.App: java.io.FileNotFoundException: { "version": 3, "coins": [ { "title": "Next Gen Finance", "code": "NXGN", "decimal" :18,“类型”:“bep20”,“地址”:“0x260A4A7849D65E7d4aEE31Fcf5c917c5a977e985”},'
  • 我认为您从 json 获取数据并创建新文件。
猜你喜欢
  • 1970-01-01
  • 2013-08-29
  • 2022-07-21
  • 1970-01-01
  • 1970-01-01
  • 2018-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多