【问题标题】:AsyncTask not called from TimerTask androidAsyncTask 未从 TimerTask android 调用
【发布时间】:2014-07-17 14:26:30
【问题描述】:

我正在开发一个以 30 秒为间隔不断从服务器获取数据的项目。所以我将 Handler 与 Timer 一起使用并调用了 Asynctask。

但是我的异步任务没有被调用。这是我的代码,

      final Handler handler;
         handler = new Handler();
           timer = new Timer();
          TimerTask doAsynchronousTask = new TimerTask()
          {       
              @Override
              public void run() {
                  handler.post(new Runnable() {
                      public void run() {       
                          try
                          {

                              System.out.println("I am xxx");
                              LiveTrack myActivity = new LiveTrack();
                              AsyncTask<String, String, String> task = myActivity.new VehiclePath();
                                task.execute();




                          } 
                          catch (Exception e) 
                          {

                          }
                      }
                  });
              }
          };
          timer.schedule(doAsynchronousTask, 0, 30000);

谁能指导我为什么要面对这个问题?

【问题讨论】:

  • 无法访问 LiveTrack 类型的封闭实例。必须使用 LiveTrack 类型的封闭实例来限定分配(例如 x.new A(),其中 x 是 LiveTrack 的实例)。为此,我得到了我的类的实例
  • 什么是 LiveTrack?是Activity,还是只是名字不好?
  • 如果是正确的Activity,你知道你不能只实例化它,对吧?
  • 是的,你是对的......但是我在尝试调用 asyntask 时遇到了这个错误
  • 什么错误?你没有发布错误,你只是说你的AsyncTask 没有被调用。我的猜测是它没有被调用,因为应用程序无法通过Activity 的实例化。将您的 AsyncTask 设为静态,或者更好的是,将其完全从 Activity 类中移除。

标签: android android-asynctask handler timertask


【解决方案1】:

您不能从 TimerTask 中创建 AsyncTask,因为它在衍生线程上运行,即 不是 UI 线程)。

AsynTask 必须仅在 UI 线程上创建和执行()。

改为使用 Executor 进行后台处理,并在需要更新 UI 时调用 runOnUiThread。

 ExecutorService executorPool =  Executors.newSingleThreadExecutor();

 executorPool.execute(new Runnable() {
    public void run() {
        // do background processing here <------------------

        myActivity.runOnUiThread(new Runnable() {
              @Override
              public void run() {
                   // update ui here <--------------------
              }
        })
    }
});

【讨论】:

  • comment // update ui 这里是我调用asynctask的地方吧?
  • @Gilad Haimov 我有一个类似的用例。在“myActivity.runOnUiThread...”中更新ui的代码是否总是保证只有在后台代码完全执行完成后才能运行?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
  • 1970-01-01
相关资源
最近更新 更多