当前位置: 首页 > 知识库问答 >
问题:

Android如何在Java中使用Kotlin协同程序?

钮鸿煊
2023-03-14

最近,我通过学习CodeLabs教程学习了kotlin coroutine。经过一些实践,我想知道我是否可以用java编写相同的代码。首先,我在MyKotlinFragment中编写了一个简单的kotlin代码。kt文件如下:

import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch

// ... some codes

    private fun myKoroutineDemo(){
        GlobalScope.launch {
            val result1:Int = foo();
            val result2:Int = bar();
            val result3 = result1 + result2;
            Log.e(TAG, ""+result3);
        }
    }

    suspend fun foo():Int{
        delay(2000);
        var result = 2+2;
        delay(500);
        return result;
    }

    suspend fun bar():Int{
        delay(2000);
        var result = 7-2;
        delay(500);
        return result;

    }

在我的片段中调用了myKotlinDemo();它起作用了。

接下来,我打开了一个名为MyRoutineFragment的java文件。java在同一个项目中,但我无法让它工作。

import kotlinx.coroutines.delay;     
import kotlinx.coroutines.launch;   // delay and launch imports arenot fount and so they are red

private suspend int foo(){ return 2 + 2; }
// the `suspend` keyword is not found by android studio, same with the bar method

private void myCoroutineDemo(){
  // GlobalScope.launch don't show up here, 
}

我无法将第一个文件转换为Java。我该怎么解决这个问题?

如果无法转换,那么我为什么以及如何在Java中使用协同程序?

共有2个答案

后安民
2023-03-14

对于简单的后台任务,我建议使用异步类Runnable。

示例调用:

mRunnable = Runnable {
    // May or may not run on the UI Thread, depending on the way you call the Handler.
}

Handler mHandler = new Handler();
// Run it using "mHandler.run()". Or run it delayed:
mHandler.postDelayed(
    mRunnable, // Runnable
    1000 // Delay in milliseconds
)

另一种选择是使用一个真正的线程,你可以在运行中创建,或者创建一个类并从线程继承

Thread thread = new Thread() {
    @Override
    public void run() {
        try {
            // Does not run on UI thread (non-blocking)
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
};

thread.start();
贲绪
2023-03-14

对于Java问题中的协程,请在stackOverflow上检查此问题。

但在我的Humble看来,使用其他工具进行异步调用(例如RXjava)。你会被召回,但我想会没事的。

但是请注意不要使用AsyncWork,因为它现在已经过时了。

 类似资料:
  • 我使用Refught2调用kotlin协同程序的API,但API的状态代码为200、400和700。当请求API和响应状态代码为400或700时,“withTimeout”协同程序可能会异常崩溃。我想处理带有“withTimeout”协同程序的状态代码400和700响应消息,或者如何自定义“协同程序”谢谢。 这是我的密码 错误消息

  • 我在测试在kotlin的协程里使用网络io是否会导致线程阻塞 测速结果是InputStream.read确实导致线程阻塞了,而不是挂起。 那么运行在统一个线程下的其他协程也不能运行了,我知道可以使用 这些方式把网络请求放入其他线程 但是我想知道的是如果这两个协程都必须运行在同一个线程里时,是否可以通过修改代码(比如异步io等方式)确保第一个协程能每秒打印一次,第二个协程能在接收到数据时及时打印。

  • 使用Gradle 4.4.1和静态编程语言-DSL,我想在我的静态编程语言1.2.20项目中配置实验性的静态编程语言协程。这被证明是出奇困难的。 官方静态编程语言留档本身只提到Groovy DSL的Gradle,而不是静态编程语言。 Kotlin DSL项目有一个不起作用的协同路由示例。可能是针对较旧的Gradle版本(该脚本中的Kotlin版本为1.1.51,这本身就是可疑的)。 PS:甚至In

  • 我使用改造2.7.1与静态编程语言协程。 我的改装服务定义如下: 此调用返回HTTP 204无内容响应,这会导致改装时崩溃: 如何使用协程处理改造中的204响应而不崩溃?

  • 我想在我的应用程序中实现autolinktextview。github中有一个库,现在我想在我的应用程序中使用,但库语言是kotlin,我的应用程序项目语言是java。下面给出的库Url和我使用的依赖项。 https://github.com/armcha/AutoLinkTextViewV2

  • 我正在尝试从 Java 7 调用科特林函数。我正在使用协程,这个被调用的函数正在挂起,例如: 我在版本 0.25.3 中使用了协程,我可以通过传递继续来模拟简单的 Java 回调样式 ,但是我使用的是Android,这意味着只使用Java 7。另一方面,简单的< code>Future太愚蠢了,因为我不想定期检查函数是否完成——我只想在函数完成时被调用。我真的希望避免添加新的库或许多额外的类/方法