【问题标题】:Force an Async task to stop from main thread强制异步任务从主线程停止
【发布时间】:2014-01-23 20:18:52
【问题描述】:

我有一个应用程序使用 JSON 定期(固定时间间隔,20 秒)从服务器请求数据。

我当前的实现包括在 async 任务中包含一个循环,并具有 20 秒的“睡眠”条件。然而,这似乎不是一个好的实现。我的问题是有没有更好的实现。还有一种从主线程强制停止异步任务的好方法吗?

另一种选择是更改代码,让客户端发送一个请求并让服务器让服务器循环返回答案。这是一个更好的实施方式,提前谢谢你:)

protected String doInBackground(String... args) {

            String RegistrartionID = RegisID();

            while (true){
                List<NameValuePair> params = new ArrayList<NameValuePair>();
                params.add(new BasicNameValuePair("Start_Term", args[0]));
                params.add(new BasicNameValuePair("Dest_Term", args[1]));
                params.add(new BasicNameValuePair("RegistrartionID",
                        RegistrartionID));
                Log.i("Start_Term", args[0]);
                Log.i("Dest_Term", args[1]);
                Log.i("RegistrartionID", RegistrartionID);
                JSONObject json = jsonParser.makeHttpRequest(
                        URL_SEND_CHOSEN_TERMINALS, "POST", params);

                try {
                    Thread.sleep(20000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }

            }

            return null;
        }

【问题讨论】:

  • 如果没有从循环内部中断,您将无法停止 while (true) 循环。

标签: android multithreading android-asynctask


【解决方案1】:

正如你所说,这不是一个好的实现。与流行的看法相反,AsyncTask 不适用于长期/未确定的时间流程,它适用于短期任务,因此它可以在之后退出并结束。

出于您的目的,我建议您使用Service。基本上是因为您具有启动它并在您定义它的 Activity 中停止它的优势。您可能会看到它的文档herethis 也可能有帮助,这是一个很好的例子。

【讨论】:

  • 抱歉回复晚了,您的方法与 user3229580 的警报管理器建议一起使用,非常感谢你们俩 :)
【解决方案2】:

我建议你使用一个服务来执行你的 AsyncTask 并且每 20 秒循环一次,你可以使用AlarmManager

【讨论】:

    猜你喜欢
    • 2012-08-06
    • 1970-01-01
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多