使用Kotlin进行Android开发,如何调用python?

chaquopy 除外!是收费产品,请问是否还有其他方法可以使用kotlin调用python脚本?

https://github.com/kivy/python-for-android

可以用python-for-android开源库

  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/1100008
  • 除此之外, 这篇博客: Kotlin协程,我学“废”了中的 如何使用使用协程,以及协程中的一些重要概念 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  •   首先先介绍一下怎么开启一个协程,在Android开发中,如果是在Activity或者Fragment中,那么可以通过以下这种方式开启一个协程。

    class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            lifecycleScope.launch{
                //这里面就是协程
            }
        }
    }
    

      然而我们肯定不止在Activity或者Fragment中去使用协程,那么其他地方怎么去开启协程呢?要搞清楚这一点,就要知道lifecycleScope是什么。
    lifecycleScope是一个实现了CoroutineScope类的一个实例。CoroutineScope翻译过来就是协程作用域,到这里我们就清楚了,要开启一个协程,首先就要有一个协程作用域。通过协程作用域的实例去启动一个协程。
    在Android开发中呢,很多时候不需要我们自己创建协程作用域,因为android中有很多拓展属性。比方上面说的ActivityFragment中有lifecycleScopeViewModel中有viewModelScope,可以直接使用这些拓展属性去开启一个协程。那其他地方怎么去创建一个协程作用域呢?首先就是可以通过MainScope()去创建一个主线程下协程作用域,还有可以通过CoroutineScope(Dispatchers.IO)去创建一个IO线程下的协程作用域。如下

    // demo1
    val scope = MainScope()
    scope.launch{
        Log.d(TAG,Thread.currentThread().name)  // 打印main
    }// demo2
    val scope2 = CoroutineScope(Dispatchers.IO)
    scope2.launch {
        Log.d(TAG,Thread.currentThread().name) // 打印DefaultDispatcher-worker-1
    }
    

      上面的这段代码还有一个地方没有讲清楚CoroutineScope(Dispatchers.IO)里面的参数是什么?其实CoroutineScope(context: CoroutineContext)接收的是一个CoroutineContext实例,CoroutineContext翻译过来就是协程的上下文的意思。

      协程上下文是各种不同元素的集合。其中元素包含了了一个CoroutineDispatcher,即协程调度器它确定了相关的协程在哪个线程或哪些线程上执行。
       协程调度器可以将协程限制在一个特定的线程执行,或将它分派到一个线程池,亦或是让它不受限地运行。
    比如上述的例子通过demo1里面的MainScope()协程作用域开启的协程,协程是运行在主线程里面的。demo2的协程就是运行在io线程里面的。即使是在通过MainScope()开启的协程,依旧可以指定线程。啥意思,看如下这个例子,launch里面多了Dispatchers.IO这个参数

    val scope = MainScope()
    val job = scope.launch(Dispatchers.IO){
        Log.d(TAG,Thread.currentThread().name) //打印 DefaultDispatcher-worker-1
    }
    

      这里面打印的就不是主线程了,而是IO线程了。看到这里明白了吗?

    协程调度器才是真正决定协程在哪个线程运行的关键,而协程作用域只是给这个协程提供了一个生命周期的管理而已。它并不能真正决定协程运行在哪一个线程。 那么demo1打印main的现象怎么解释?因为launch函数如果不传协程的上下文,它就默认是协程作用域里面的上下文,而MainScope()默认的上下文里面的调度器就是Dispatchers.Main.

      总结对比一下上面讲述的几个概念: 协程作用域:主要负责管理协程的生命周期。 协程上下文:由各种元素组成,其中一个元素是协程调度器。 协程调度器:定了相关的协程在哪个线程或哪些线程上执行。以及切换协程

  • 您还可以看一下 CSDN讲师老师的为什么说Kotlin是你下一个要掌握的语言?课程中的 为什么说Kotlin是你下一个要掌握的语言?(下)小节, 巩固相关知识点