【问题标题】:How to execute AsyncTask in endless loop?如何在无限循环中执行 AsyncTask?
【发布时间】:2016-09-06 19:36:05
【问题描述】:

我有 AsyncTask 类,方法如下(类:ApiConnector):

@Override
protected String doInBackground(Void... voids)
{ 
    return getToken(); //<-- do many the most important things and return String
}

@Override
protected void onPostExecute(String result)
{
    super.onPostExecute(result);
}

然后在我的活动中:

new ApiConnector()
{
    @Override
    public void onPostExecute(String result)
    {
        Log.d("here: ", result);
    }
}.execute();

当我执行一次时它工作得很好,但我必须在无限循环中执行此操作才能在我的市场上获取新鲜的令牌,比如新鲜的苹果。我试过这样的事情:

while (true)
{
    new ApiConnector()
    {
        @Override
        public void onPostExecute(String result)
        {
            Log.d("here!", result);
        }
    }.execute();
    Thread.sleep(1000);
}

还有很多愚蠢的事情,但我找不到工作方式。所有线程业务对我来说都很棘手。给我一些力气,我肯定能做到这一点。

【问题讨论】:

  • 在循环中调用异步?这是一个非常糟糕的决定,伙计。使用TimerHandler 在给定时间段内更新您的令牌或其他任何内容。你也可以callOnExecutor()AsyncTask 并行运行多个线程
  • 我是第一次在 android 中写东西,所以非常糟糕的决定对我来说很正常。感谢帮助,我会阅读更多关于 Timer 或 Handler 的内容。

标签: java android android-asynctask


【解决方案1】:

你不想这样做。所有 AsyncTask 都在一个线程上运行。如果您在 AsyncTask 中无限循环,您将饿死所有其他任务。如果您让每个任务开始一个新任务,那么您仍然会面临严重的饥饿问题。

如果你想这样做(我不确定你是否真的这样做,但让我们忽略它),正确的方法是使用线程。一个线程只能有一个巨大的 while(true) 循环和一个 sleep 语句。

【讨论】:

  • 使用线程是个问题,例如:stackoverflow.com/questions/7857343/…我没写但是getToken()只是一个愚蠢的名字——在现实生活中我需要做很多事情比如下载json还有其他(现在不重要)。像 write 方法 downloadJson 这样的简单解决方案不起作用,因为我不能在 android 主线程活动中做这样的事情。我在 AsyncTask 中得到了“正确的方法”(最好不要改变),但我想刷新我的 json 30 秒,现在我遇到了问题 - 如何用那个奇怪的 AsyncTask 做到这一点。
  • 首先,这个问题是由一个不明白他们在做什么的人写的——可以从线程中调用异步任务。其次,您将使用线程而不是 AsyncTask。 AsyncTask 是您想要的错误解决方案。
【解决方案2】:

hrskrs 评论说我更喜欢使用Handler 重复执行某些操作。主要优点是postDelayed 使run() 方法在主应用程序线程中执行 - 因此您可以访问和更改 UI 组件。

这是一个例子:

public class MyTest implements Runnable {
    private final static int INTERVAL = 5000;

    private Handler mHandler;

    private MyTest() {
        mHandler = new Handler();
    }

    public void start() {
        run();
    }

    public void stop() {
        mHandler.removeCallbacks(this);
    }

    @Override
    public void run() {
        // put here the logic that you want to be executed
        mHandler.postDelayed(this, INTERVAL);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多