Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 访问UI线程以从Java库回调?_Android - Fatal编程技术网

Android 访问UI线程以从Java库回调?

Android 访问UI线程以从Java库回调?,android,Android,我正在尝试尽可能干净地实现Android应用程序 为此,我定义了一个Java库,用于实现我的逻辑和非Android特定功能 例如,我的应用程序对RESTAPI进行大量网络调用,并生成模型和验证 库正在使用改型,它处理异步调用。但是,现在我需要链接调用,这意味着: 来自第一个调用的回调将触发下一个请求(可能导致“回调地狱”) 默认情况下,进入UI线程,创建一个新线程来执行请求,但是在返回调用方时,我需要能够再次加入UI线程 我对(1)不感兴趣,因为我们已经有了这样的代码,而且非常混乱 (2) 如果

我正在尝试尽可能干净地实现Android应用程序

为此,我定义了一个Java库,用于实现我的逻辑和非Android特定功能

例如,我的应用程序对RESTAPI进行大量网络调用,并生成模型和验证

库正在使用改型,它处理异步调用。但是,现在我需要链接调用,这意味着:

  • 来自第一个调用的回调将触发下一个请求(可能导致“回调地狱”)
  • 默认情况下,进入UI线程,创建一个新线程来执行请求,但是在返回调用方时,我需要能够再次加入UI线程
  • 我对(1)不感兴趣,因为我们已经有了这样的代码,而且非常混乱

    (2) 如果有一种方法可以获得对传入线程(UI线程)的引用,那么当模型准备好返回时,可以再次加入它,这将是我的首选选项


    这可能吗?

    要在线程上运行任何东西,您需要某种消息循环。UI线程是Android的一部分,我想如果不访问Android类,就不可能在上面运行某些东西

    使用系统API很容易获得UI线程。然后可以发布要在该线程上运行的Runnable

    new Handler(Looper.getMainLooper()).post(new Runnable(){
        public void run(){
            // your code
        }
    });
    

    您可以使用
    AsyncTask
    来完成此任务。顾名思义,
    AsyncTask
    是一个异步类,它有一个
    doInBackground
    方法,该方法在后台执行,类似于
    Thread
    ,还有一个
    onPostExecute
    方法,该方法在UI上运行,允许您执行任何与UI相关的活动。有关
    AsyncTask
    的更多信息可在此处找到:

    您所说的“链调用”是什么意思?这与ui线程有什么关系?你能给我们一个示例代码吗?在一个请求之后,提出另一个请求。默认情况下,改型将提供在原始请求上运行的回调。我将选项2与asynctask一起使用。您也可以尝试选项3,使用RxJava和chain
    Observables
    .I“我现在正在看RxJava。这不是最容易理解的事情,但它似乎适合我的用例!当然可以,但我在一个纯Java库中,我不想让调用方承担必须离开后台线程的负担。AsyncTask:“这个类在API级别30中被弃用”