【问题标题】:Android sequential execution of functionsAndroid顺序执行函数
【发布时间】:2020-10-26 15:28:21
【问题描述】:

我知道 Android UI 并不是真正用于执行功能并等待它们完成,但是,我认为有些用例是必需的,例如网络。

我的问题是,我想运行一系列相互依赖的网络操作,并且比下一次执行所花费的时间要多一点,所以需要等待:

  1. 启动热点
  2. 获取网络接口和 IP
  3. 启动套接字

最初我使用按钮测试了一切正常,然后在我按下按钮之间等待。但现在我想自动化它。我用谷歌搜索,但我发现的只是异步任务的解决方案,它已被弃用。我尝试使用线程并加入,但这通常会导致可运行的奇怪崩溃,而且它不是很优雅。不知道有没有其他解决办法?

【问题讨论】:

    标签: android networking sequence


    【解决方案1】:

    使用 SDK 可以做的最好的事情是使用 Executors 在后台按顺序运行您的工作

            val newSingleThreadExecutor = Executors.newSingleThreadExecutor()
            newSingleThreadExecutor.execute {
                // 1...
            }
            newSingleThreadExecutor.execute {
                // 2...
            }
    

    但是如果你想从后台触摸 UI 应该创建处理程序检查视图是否不为空

            val handler = Handler(Looper.myLooper()!!)
            newSingleThreadExecutor.execute {
                handler.post {
                    view?.visibility = View.GONE
                }
            }
    

    【讨论】:

    • 谢谢,就是这样!我之前使用过 SingleThreadExecutors,但没有想到。我调整了java的代码:Executor steps = Executors.newSingleThreadExecutor();步骤.执行(this::fkt1); steps.execute(this::fkt2);...
    【解决方案2】:

    这样的事情怎么样?

    new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
              startHotspot();
              getNetworkInterfaceAndIP();
              startSocket();
             }
           }, 300);
    

    【讨论】:

    • 这不是像往常一样执行所有三个,除了延迟 300 毫秒(但不是每个,对吧)?
    • 嗯,300毫秒是可变的,不一样的,你放在handler.postDelayer里,这和在线程里运行是一样的。
    • 是的,但我的意思是,我想运行 fun1,等待它完成,fun2,等待......等等。您的处理程序只是等待,fun1、fun2、fun3,对吗?当然我可以做 3 个处理程序,但是执行程序可以按我的意愿工作。
    • 哦,我以为你想在后台运行它们,没有一个功能等待另一个,对不起,在那种情况下我的回答是无关紧要的]
    猜你喜欢
    • 1970-01-01
    • 2016-04-07
    • 2013-04-19
    • 2017-04-21
    • 2015-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多