Java 将AsyncTask放置在何处,以便它';它只开始过一次
现在,我有一个计时器在Java 将AsyncTask放置在何处,以便它';它只开始过一次,java,android,android-fragments,android-asynctask,Java,Android,Android Fragments,Android Asynctask,现在,我有一个计时器在片段sonCreate方法中启动异步任务(计时器间隔为1分钟)。所以我认为这不是一个好主意,因为如果有配置更改,片段将再次调用onCreate方法,我将有2个运行计时器异步任务,对吗 因此,我需要某种方法将AsyncTask放在应用程序整个生命周期中只启动一次的位置。您可以使用a并在onDestroy()中取消它。。这将保证您在任何时候都只能运行一个 至于只开始一次,你必须根据你的需要在某个地方坚持这些知识。也许在onSaveInstanceState中存储一个布尔值,然后
片段sonCreate
方法中启动异步任务(计时器间隔为1分钟)。所以我认为这不是一个好主意,因为如果有配置更改,片段将再次调用onCreate方法,我将有2个运行计时器异步任务,对吗
因此,我需要某种方法将AsyncTask放在应用程序整个生命周期中只启动一次的位置。您可以使用a并在onDestroy()中取消它。
。这将保证您在任何时候都只能运行一个
至于只开始一次,你必须根据你的需要在某个地方坚持这些知识。也许在onSaveInstanceState
中存储一个布尔值,然后在onCreate()
中读取它就可以了
而且,正如@marcin_j所指出的,异步任务是按顺序执行的(除非特别以不同的方式启动),因此使用一个异步任务将阻止应用程序中的所有其他异步任务(如下载内容等)。您可以使用一个异步任务并在ondestory()中取消它。这将保证您在任何时候都只能运行一个
至于只开始一次,你必须根据你的需要在某个地方坚持这些知识。也许在onSaveInstanceState
中存储一个布尔值,然后在onCreate()
中读取它就可以了
而且,正如@marcin_j所指出的,异步任务是按顺序执行的(除非以不同的方式启动),因此使用一个异步任务将阻止应用程序中的所有其他异步任务(如下载内容等).如果有配置更改,活动将被销毁并重新创建,因此不需要运行两个计时器。如果有配置更改,活动将被销毁并重新创建,因此不需要运行两个计时器对于简单计时器,请尝试此操作-
class MyFragment extends Fragment{
private int currentTime;
private void startTimer(){
new Handler().
postDelayed(new Runnable(){
@Override
public void run()
{
onTick();
startTimer();
}
},1000*60);
}
private void onTick()
{
currentTime++;
}
@Override
public void onSaveInstanceState(Bundle outState)
{
outState.putInt("currentTime", currentTime);
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (savedInstanceState != null)
{
currentTime=savedInstanceState.getInt("currentTime",0);
startTimer();
}
}
简单计时器不需要Asynctask,请尝试以下操作-
class MyFragment extends Fragment{
private int currentTime;
private void startTimer(){
new Handler().
postDelayed(new Runnable(){
@Override
public void run()
{
onTick();
startTimer();
}
},1000*60);
}
private void onTick()
{
currentTime++;
}
@Override
public void onSaveInstanceState(Bundle outState)
{
outState.putInt("currentTime", currentTime);
super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (savedInstanceState != null)
{
currentTime=savedInstanceState.getInt("currentTime",0);
startTimer();
}
}
但是AsyncTask正在一个单独的线程中运行。我假设即使活动被销毁,AsyncTask线程也会继续运行?活动将被销毁,但当它设置了saveInstanceState
或类似设置时,片段可能不会被销毁。@PeterWarbo你是对的,即使在配置更改期间片段被删除,AsyncTask仍然可以运行。但是AsyncTask正在单独的线程中运行。我假设即使活动被销毁,AsyncTask线程也会继续运行?活动将被销毁,但当它设置了saveInstanceState
或类似设置时,片段可能不会被销毁。@PeterWarbo你是对的,AsyncTask仍然可以运行,即使在配置更改期间片段被删除。可能一个简单的方法是检查savedInstanceState
是否为null
,这意味着这是第一次创建片段,所以我在其中启动AsyncTask?布尔方法是更好的方法,这也是未来的证明。我不确定savedInstanceState
是否保证在后续启动中不为空,特别是如果您从未将任何内容保存到它。可能一种简单的方法是检查savedInstanceState
是否为null
,这意味着这是第一次创建片段,因此我在其中启动异步任务?布尔方法是更好的方法,也是未来的证明。我不确定savedInstanceState
是否保证在随后的启动中不为null,特别是如果您从未将任何内容保存到它。我正在AsyncTask中下载一些内容(这就是我使用AsyncTask的原因)。我正在AsyncTask中下载一些内容(这就是我使用AsyncTask的原因)。