活动加载一次又一次

Posted

技术标签:

【中文标题】活动加载一次又一次【英文标题】:Activity Loading again and again 【发布时间】:2021-07-07 04:36:21 【问题描述】:

我正在尝试在日期到达时打开另一个活动,否则会显示剩余的日期秒数,但问题是当我运行应用程序时,它会一次又一次地加载相同的页面。

但是当我从爆破活动中运行时没有问题,但是当我从倒计时活动中运行时,爆破活动会随着日期的到来而一次又一次地打开。我的意思是未来日期大于或等于给定日期。

下面是倒计时活动:

public void countDownStart() 
        handler = new Handler();
        runnable = new Runnable() 
            @Override
            public void run() 
                handler.postDelayed(this, 1000);

                // using try and catch for error handling
                try 
                    SimpleDateFormat dateFormat = new SimpleDateFormat(
                            "yyyy-MM-dd");
       
                    // Please here set your event date//YYYY-MM-DD
                    Date futureDate = dateFormat.parse("2021-04-12");
                    
                    Date currentDate = new Date();
                    if (!currentDate.after(futureDate)) 
                        long diff = futureDate.getTime()
                                - currentDate.getTime();
                        long days = diff / (24 * 60 * 60 * 1000);
                        diff -= days * (24 * 60 * 60 * 1000);
                        long hours = diff / (60 * 60 * 1000);
                        diff -= hours * (60 * 60 * 1000);
                        long minutes = diff / (60 * 1000);
                        diff -= minutes * (60 * 1000);
                        long seconds = (diff / 1000)+(minutes*60)+(hours*60*60)+(days*60*60*60);
                        text1.setText("" + String.format(FORMAT, seconds));
                     else 
                        Intent intent = new Intent(CountDown.this,BlastActivity.class);
                        startActivity(intent);
                        finish();
                    
                 catch (Exception e) 
                    e.printStackTrace();
                
            

        ;
        handler.postDelayed(runnable, 1 * 1000);
    

下面是爆破活动:

public class BlastActivity extends AppCompatActivity 
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) 
//        Playing audio on activity open
        MediaPlayer birthday = MediaPlayer.create(BlastActivity.this, R.raw.birthday);
        birthday.start();
        super.onCreate(savedInstanceState);
        setContentView(R.layout.blast);

        // Delaying the next activity to be executed to wait for song finish
        new Timer().schedule(new TimerTask() 

            @Override
            public void run() 
                Intent intent = new Intent(BlastActivity.this, MainActivity.class);
                birthday.stop();                // Song stopped when moving to next activity
                startActivity(intent);
                finish();
            
        , 20000);
    



这是 android MainFest 文件代码:

<activity android:name=".BlastActivity">
        </activity>
        
        <activity android:name=".CountDown" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".MainActivity" android:launchMode="singleTask"/>

每当我打开应用程序时,Blast Activity 都会一次又一次地加载。

【问题讨论】:

在完成活动前删除处理程序回调 handler.removeCallbacksAndMessages(null); 非常感谢...您的想法奏效了。我努力了好几天终于解决了。 我写了一个答案。接受它,这样每个人都可以知道正确的答案 【参考方案1】:

您需要在启动新 Activity 之前从处理程序中删除回调。你可以这样做

handler.removeCallbacksAndMessages(null);

【讨论】:

【参考方案2】:

好吧,问题是Handler 继续执行Runnable 尽管你已经销毁了活动。最简单的解决方案是添加另一个实例变量,如下所示,

boolean terminateTimer = false;

并在将 runnable 发布到 Handler 之前检查这一点。

runnable = new Runnable() 
  public void run() 

    if (terminateTimer) // add this
      return;

    handler.postDelayed(this, 1000);
    try 
      ...
      else 
        terminateTimer = true;
        ...
      
     catch (Exception e)  ... 
  
;

当您需要停止计时器时,将值更改为true

public void onDestroy() 
  terminateTimer = true;
  ...

【讨论】:

以上是关于活动加载一次又一次的主要内容,如果未能解决你的问题,请参考以下文章

Swift:每次重新加载时都会一次又一次地添加表格视图单元格内容?

一次又一次地在新的相同标签中打开一个网址

DialogFragment:如何防止一次又一次的动画?例如后台后

异常结果集耗尽一次又一次发生

使用循环一次又一次地迭代

为啥 CoreBluetooth 一次又一次地发现相同的外设?