【问题标题】:Current Acttivity AutoStarts before timer ends?当前活动在计时器结束前自动启动?
【发布时间】:2018-08-20 08:29:54
【问题描述】:

我正在尝试在计时器启动时启动一项活动,并在计时器在 10 秒后结束时再次启动当前活动。但是 5 秒后,当前活动再次开始,并且在计时器结束后调用 onFinish() 方法。 我没有在当前活动中的任何其他位置或在计时器启动时正在启动的活动中启动 crrent 活动。 请帮助我理解这一点。谢谢

timer= new CountDownTimer (time, 1000) {

                    public void onTick(long millisUntilFinished) {
                        switch (activity_state){
                            case 1:
                                //this toast is being used to display time
                            Toast.makeText(getApplicationContext(),String.valueOf(millisUntilFinished/1000),Toast.LENGTH_SHORT).show();
                                if(millisUntilFinished==time){
                                    finish();
                                    startActivity(new Intent(SettingsActivity_2.this,OneYearActivity.class));}
                                break;
                            case 2:
                                if(millisUntilFinished==time)
                                {finish();startActivity(new Intent(SettingsActivity_2.this,TwoYearActivity.class));}
                                break;
                            case 3:
                                if(millisUntilFinished==time)
                                {finish();startActivity(new Intent(SettingsActivity_2.this,ThreeYearActivity.class));}
                                break;
                            case 4:
                                if(millisUntilFinished==time)
                                {finish();startActivity(new Intent(SettingsActivity_2.this,AllYearActivity.class));}
                                break;
                        }
                    }
                    public void onFinish() {
                        Toast.makeText(getApplicationContext(),"OnFinishCalled",Toast.LENGTH_SHORT).show();
                        startActivity ( new Intent ( SettingsActivity_2.this,SettingsActivity_2.class ));
                    }
                }.start();

OneYearActivity.java 此活动从第一个案例开始。

public class OneYearActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_one_year_kid);
    initializing_components();
    setSupportActionBar(toolbar);

}}

我将从this main screen 转到this password screen,命名为SettingActivity_2,如果密码正确,应该转到命名为OneYearActivitythis activity 及之后10 秒后,SettingsActivity_2 应该会重新开始。但 5 秒后,SettingsActivity_2 启动。

添加处理程序后启动新活动 我的处理程序代码

handler=new Handler();
 r=new Runnable() {
 @Override
  public void run() {
finish();
 }
 };

从 OneYearActivity 启动新 Activity 以播放视频

        learning_songs.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent=new Intent(OneYearActivity.this,PlayVideo.class);
        intent.putExtra("video_Id","vkRDOcma9Qk");
            startActivityForResult(intent,1);
        }
    });

从 OneYearActivity 开始播放 Youtube 视频的活动

public class PlayVideo extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_play_video);

    YouTubePlayerView youtubePlayerView =    findViewById(R.id.youtube_player_view);
    getLifecycle().addObserver(youtubePlayerView);
VideoPlayer videoPlayer=new VideoPlayer();
    Intent intent=getIntent();

String video_Id=intent.getStringExtra("video_Id");
videoPlayer.play_Video(youtubePlayerView,video_Id);

}

我想做什么

  1. 开始设置2
  2. 点击开始 OneYearActivity 显示 10 秒
  3. 如果用户按下 learning_songs,它会播放新的活动,并且应该在前一个活动中启动的计时器结束时结束

我得到了什么

  1. 开始设置2
  2. 点击开始显示 10 秒的 OneYearActivity
  3. 如果用户按下 learning_songs,它会播放新的活动,并且随着计时器的结束,它不会完成 播放视频 活动

【问题讨论】:

    标签: android countdowntimer


    【解决方案1】:

    您的代码应如下所示:
    在活动中,您正在切换状态:

    switch (activity_state) {
            case 1:
                //this toast is being used to display time
                Toast.makeText(getApplicationContext(), String.valueOf(millisUntilFinished / 1000), Toast.LENGTH_SHORT).show();
                startActivity(new Intent(SettingsActivity_2.this, OneYearActivity.class));
                finish();
                break;
            case 2:
                startActivity(new Intent(SettingsActivity_2.this, TwoYearActivity.class));
                finish();
                break;
            case 3:
                startActivity(new Intent(SettingsActivity_2.this, ThreeYearActivity.class));
                finish();
                break;
            case 4:
                startActivity(new Intent(SettingsActivity_2.this, AllYearActivity.class));
                finish();
                break;
    
            default:
                break;
        }
    

    以及您希望在 10 秒后进行的每个下一个活动:

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        //display whatever you need
    
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
    
                finish();
            }
        }, 10000);
    }
    

    【讨论】:

    • 如果我采用这种方法,并从 OneYearActivity 开始一个新活动,它不会结束新开始的活动
    • @Nancy,当您调用 start 时,CountDownTimer 会立即启动。因此,当您输入密码并启动 OneYearActivity 时,已经过了几秒钟。尽量不要做任何事情。它将在 10 秒内再次开始活动。您必须在需要的活动中发布 10 秒延迟。您可以按照 Yogesh Rathi 的建议将代码移动到基类
    【解决方案2】:

    OneYearActivity.java 添加以下代码。

    final Handler handler = new Handler();
    final Runnable r = new Runnable() {
        public void run() {
            openSettingsActivity_2WithRequestCode();
        }
    };
    

    onCreate()这样称呼它

    handler.postDelayed(r, 10000);
    

    更新 1

    如果代码重复创建一个abstract(ParentActivity),它具有所有活动的公共代码和extendsAppCompactActivity,并创建extends ParentActivity的子类并在代码子类活动中使用。

    更新 2

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
     try {
      super.onActivityResult(requestCode, resultCode, data);
    
      if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
           handler.postDelayed(r, 1);
      }else{
          finish();
      }
     } catch (Exception ex) {
      Toast.makeText(Activity.this, ex.toString(),
       Toast.LENGTH_SHORT).show();
     }
    }
    

    更新 3

    什么是onActivityResult

    https://developer.android.com/training/basics/intents/result

    注意:如果您需要任何帮助,请根据您的要求告诉我,我会更新代码。

    【讨论】:

    • 它将在我的应用程序中添加大量代码重复。我不想创建任何代码重复
    • 哪种代码会产生重​​复。如果重复活动相关代码,则创建抽象活动并根据需要调用活动以简化代码。
    • @Nancy,不要使用倒计时,根据图像,您应用与儿童相关的动画和游戏,倒计时更重,所以使用轻量级线程,我也开发了某种应用程序,但从未使用过 countDownTimer ,真的很重。因为将来您的需求会更新,那么您将面临很多问题。使用处理程序,您可以按点击执行代码,基本上按要求按事件执行代码,使用 has-a 关系。
    • 如果我采用这种方法,并从 OneYearActivity 开始一个新活动,它不会结束新开始的活动
    • 你可以创建一个静态变量,用于标志,这个标志可以帮助你,你想不想开始
    【解决方案3】:

    在您的情况下,请执行以下操作:

    1.从 SettingsActivity_2 启动 OneYearActivity

    startActivity(new Intent(this, OneYearActivity.class));
    

    2。为 OneYearActivity 的结果启动 PlayVideoActivity

    private static final int PLAY_VIDEO_REQUEST_CODE = 1;
    
    /*protected */ Runnable finishAction = new Runnable() {
            @Override
            public void run() {
                finishActivity(PLAY_VIDEO_REQUEST_CODE);
                finish();
            }
        };
    
    /* in initialize method*/
        learning_songs.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent=new Intent(OneYearActivity.this,PlayVideo.class);
                intent.putExtra("video_Id","vkRDOcma9Qk");
                startActivityForResult(intent, PLAY_VIDEO_REQUEST_CODE);
                toolbar.postDelayed(finishAction, 10000);
            }
        });
    

    您可以从 PlayVideo 活动开始

    youtubePlayerView.postDelayed(finishAction, 10000);
    

    输入结果

    /*protected */ Runnable finishAction = new Runnable() {
            @Override
            public void run() {
                setResult(RESULT_OK);
                finish();
            }
        };
    

    当您收到此代码时,在 onActivityResult 中完成 OneYearActivity

    if (resultCode == PLAY_VIDEO_REQUEST_CODE) {
        finish();
    }
    

    【讨论】:

    • 问题依然存在。当我从 OneYearActivity 开始一个新活动时,处理程序不会停止该活动。
    • 请再看问题。
    • @南希。它是否可以工作(完成)而不为结果开始新的活动?
    • 顺便说一句,我不使用新的处理程序
    • 是的。它适用于 ** toolbar.postDelayed(r, 10000);** 并且 r 是 Runnable。但 PlayVideo 活动仍然没有关闭
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多