Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将AsyncTask放置在何处,以便它';它只开始过一次_Java_Android_Android Fragments_Android Asynctask - Fatal编程技术网

Java 将AsyncTask放置在何处,以便它';它只开始过一次

Java 将AsyncTask放置在何处,以便它';它只开始过一次,java,android,android-fragments,android-asynctask,Java,Android,Android Fragments,Android Asynctask,现在,我有一个计时器在片段sonCreate方法中启动异步任务(计时器间隔为1分钟)。所以我认为这不是一个好主意,因为如果有配置更改,片段将再次调用onCreate方法,我将有2个运行计时器异步任务,对吗 因此,我需要某种方法将AsyncTask放在应用程序整个生命周期中只启动一次的位置。您可以使用a并在onDestroy()中取消它。。这将保证您在任何时候都只能运行一个 至于只开始一次,你必须根据你的需要在某个地方坚持这些知识。也许在onSaveInstanceState中存储一个布尔值,然后

现在,我有一个计时器在
片段
s
onCreate
方法中启动异步任务(计时器间隔为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的原因)。