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

Android:创建一个定期运行的后台线程,并执行UI任务?

斜宁
2023-03-14

好的,我知道如何执行回溯任务,我知道如何执行定期任务(使用handle postdelayed和runnable),我还知道如何从后台线程(通过处理程序)执行UI任务,但我无法执行在UI线程上执行某些操作的定期后台任务。

我每分钟都在尝试执行一些后台任务,在这些任务中我必须打一个网络电话。调用结束后,根据输出,我必须更新UI。我试过这样做

private void DoTask() {
        Thread thread = new Thread() {
            public void run() {
                Looper.prepare();
                final Handler handler = new Handler();
                handler.post(netRunnable);
                Looper.loop();
            }
        };
        thread.start();
}

Runnable netRunnable = new Runnable() {
    @Override
    public void run() {
        handler.getLooper().prepare();
        final Handler handler1 = new Handler(Looper.getMainLooper());
        if ( do background work and check result){
            handler1.post(new Runnable() {
                @Override
                public void run() {
                    //Do UI Task
                }
            });
        }
        handler.getLooper().loop();
        handler.postDelayed(netRunnable, 60000);
    }
}

我知道我的实现可能有一些根本性的缺陷,但我不知道如何正确地完成这项任务。现在它给出了一个错误,即每个线程只能创建一个循环器。我明白它想说什么。但是谁能建议用正确的方法来做这件事呢。

共有3个答案

高茂
2023-03-14

如果活动频繁切换,为什么不颠倒职责呢。您可以创建一个执行定期网络任务的服务。

然后,-您的活动定期调用此服务以获取值。-或者您使用侦听器系统:您创建一个活动必须实现的接口,以便从任务完成中获得通知

微生昌胤
2023-03-14

也许你更适合创建一个单独的(Intent)服务,并定期用postDelayed调用它。在活动中创建BroadcastReceiver并在其中处理UI更改。

处理来自其他线程的UI更改的另一个提示:这是不可能的。因此,您需要调用runOnUiThread。下面是如何使用它

拓拔坚
2023-03-14

您可以使用异步任务。这些是为它设计的:

http://developer.android.com/reference/android/os/AsyncTask.html

它允许您在后台执行网络调用,然后在得到结果后,在UI线程上执行操作

宣言:

 private class MyTask extends AsyncTask<Input, Void, Output> {
 protected Output doInBackground(Input... inputs) {
       // do something on the network
       return myOutput;// use this to transmit your result
 }

 protected void onPostExecute(Output result) {
     // do something on UI thread with the result
 }

}

如果要重复,只需创建一个runnable来启动它,在每次调用后,安排下一个调用:

MyTask myTask;
Handler handler = new Handler();

    Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                MyTask myTask = new MyTask();
                myTask.execute(myArg);
                handler.postDelayed(netRunnable, 60000); // schedule next call
            }
        }

第一次启动它:

handler.postDelayed(myRunnable, 60000);

或者,如果您想立即启动它:

handler.post(myRunnable);

当您的活动被破坏时,不要忘记取消任务:

myTask.cancel(true);
 类似资料:
  • 创建并执行内核线程 建立进程控制块(proc.c中的alloc_proc函数)后,现在就可以通过进程控制块来创建具体的进程/线程了。首先,考虑最简单的内核线程,它通常只是内核中的一小段代码或者函数,没有自己的“专属”空间。这是由于在uCore OS启动后,已经对整个内核内存空间进行了管理,通过设置页表建立了内核虚拟空间(即boot_cr3指向的二级页表描述的空间)。所以uCore OS内核中的所有

  • 问题内容: 我想从主Java程序中产生一个Java线程,并且该线程应单独执行而不会干扰主程序。应该是这样的: 用户启动的主程序 做一些业务工作,应该创建一个可以处理后台进程的新线程 一旦创建线程,主程序就不要等到生成的线程完成。实际上,它应该是无缝的。 问题答案: 一种简单的方法是自己手动生成线程: 另外,如果您需要产生多个线程或需要重复执行,则可以使用更高级别的并发API和执行程序服务:

  • null 所以你可以不受任何限制地做背景工作。尽管由于这些原因您应该使用服务,但链接。 这是做背景工作的另一种方式(当然不是更好,但仍然是一种方式)吗?我错了吗?

  • 我需要执行一些任务。有些任务是独立的,有些任务依赖于其他任务的成功执行。独立任务可以并行运行以获得更好的性能。我把这些任务称为服务。列说明哪些服务将以串联方式执行,哪些服务将以并联方式执行。列描述了一组定义的服务所遵循的执行顺序。例如,服务A和B应该并行运行。如果它们已成功执行,则将执行服务C。请注意,服务C并不直接依赖于其先前服务的输出,但它必须在成功执行其先前服务后运行,因为服务C在执行期间需

  • 我试着运行一个程序,使用线程显示带有数字的乘法、除法、加法和减法表。 但是我希望数字被乘以或相加等。由用户选择。 也就是说,程序应该在用户为每个操作选择一个数字后运行,然后显示结果。