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

标签 android multithreading android-handler

好的,所以我知道如何执行后台任务,我知道如何执行定期任务(使用句柄 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);
    }
}

我知道我的实现可能存在一些根本性缺陷,但我不知道如何正确完成这项任务。现在它给出了每个线程只能创建一个Looper的错误。我明白了它的意思。但任何人都可以建议以正确的方式做到这一点。

最佳答案

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

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
 }

}

如果您想重复它,只需创建一个可运行程序来启动它,并在每次调用后安排下一个调用:

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);

当您的 Activity 被销毁时,不要忘记取消任务:

myTask.cancel(true);

关于Android:创建一个定期运行并执行 UI 任务的后台线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33041573/

相关文章:

java - 如何在 Yalantis Ucrop 中提供 Assets URI

android - DialogFragment 中的 Date + Time Picker 实现了 OnDateChangedListener 和 OnTimeChangedListener

python - 如何让python进程在后台持续运行

java - 运行类时应用程序进入MainActivity

android - 有很多 HandlerThreads 活着,什么也不做,只是等待,这不好吗?

java - 事件总线订阅问题(Otto - Guava 事件总线)

android - 使用例如有什么区别机器人 :colorAccent and colorAccent attribute?

python - 防止Python线程饥饿

java - 如何同步两个队列到线程构造函数的传递?

android - 如何将消息从另一个 Activity 传递到蓝牙 Activity