Java 如何在无限循环中执行异步任务?
我有一个AsyncTask类,其方法如下(类:Java 如何在无限循环中执行异步任务?,java,android,android-asynctask,Java,Android,Android Asynctask,我有一个AsyncTask类,其方法如下(类:ApiConnector): 然后在我的活动中: new ApiConnector() { @Override public void onPostExecute(String result) { Log.d("here: ", result); } }.execute(); 当我执行这一次时,效果很好,但我必须在无休止的循环中执行这一操作,以便在我的市场中获得像新鲜苹果一样的新鲜代币。我试过这样的方
ApiConnector
):
然后在我的活动中:
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);
}
还有很多愚蠢的事情,但我找不到工作的方法。全线程业务对我来说很棘手。给我点刺激,我一定会做到。就像hrskrs评论的那样,我更喜欢使用处理程序来重复执行某些操作。主要优点是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);
}
}
就像hrskrs评论的那样,我更喜欢使用处理程序
重复执行某些操作。主要优点是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);
}
}
你不想这么做。所有异步任务都在一个线程上运行。如果在一个异步任务中无限循环,则会耗尽所有其他任务。如果你让每个任务都开始一个新任务,那么你仍然会面临严重的饥饿问题
如果您想这样做(我不确定您是否真的这样做,但让我们忽略这一点),正确的方法是使用线程。一个线程可以有一个巨大的while(true)循环和一个sleep语句结尾。你不想这样做。所有异步任务都在一个线程上运行。如果在一个异步任务中无限循环,则会耗尽所有其他任务。如果你让每个任务都开始一个新任务,那么你仍然会面临严重的饥饿问题
如果您想这样做(我不确定您是否真的这样做,但让我们忽略这一点),正确的方法是使用线程。一个线程可以有一个巨大的while(true)循环,最后有一个sleep语句。调用异步in循环?这是一个非常糟糕的决定,伙计。使用计时器
或处理程序
在给定时间段内更新您的令牌或任何内容。你也可以callOnExecutor()
AsyncTask来并行运行多个线程。我第一次在android中写了一些东西,所以非常糟糕的决定对我来说是正常的。感谢您的帮助,我将阅读更多关于计时器或处理程序的信息。要在循环中调用异步吗?这是一个非常糟糕的决定,伙计。使用计时器
或处理程序
在给定时间段内更新您的令牌或任何内容。你也可以callOnExecutor()
AsyncTask来并行运行多个线程。我第一次在android中写了一些东西,所以非常糟糕的决定对我来说是正常的。感谢您的帮助,我将阅读更多关于计时器或处理程序的内容。使用线程是一个问题,例如:我没有编写它,但getToken()只是一个愚蠢的名称-在现实生活中,我需要在那里做很多事情,如下载json和其他(现在不重要)。像write method downloadJson这样的简单解决方案不起作用,因为我无法在android主线程活动中执行类似的操作。我在AsyncTask中得到了“正确的方法”(最好不要更改),但我想刷新json 30秒,现在我遇到了一个问题——如何使用那个奇怪的AsyncTask做到这一点。首先,这个问题是由不了解自己在做什么的人写的——可以从线程调用AsyncTask。其次,您将使用线程而不是异步任务。AsyncTask不是您想要的解决方案。使用线程是一个问题,例如:我没有编写它,但getToken()只是一个愚蠢的名称-在现实生活中,我需要在那里做很多事情,比如下载json和其他(现在不重要)。像write method downloadJson这样的简单解决方案不起作用,因为我无法在android主线程活动中执行类似的操作。我在AsyncTask中得到了“正确的方法”(最好不要更改),但我想刷新json 30秒,现在我遇到了一个问题——如何使用那个奇怪的AsyncTask做到这一点。首先,这个问题是由不了解自己在做什么的人写的——可以从线程调用AsyncTask。其次,您将使用线程而不是异步任务。AsyncTask是错误的解决方案。
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);
}
}