3

onBackPressed をオーバーライドして、現在のアクティビティを終了するだけでなく、次のアクティビティへのインテントを呼び出しているときにスレッドを中断しようとしました。前に押し返したら、スプラッシュ アクティビティは終了しましたが、スレッドは実行され続け、インテントを次のアクティビティに呼び出しました。スレッドの中断 onBackPressed を含めたので、戻るボタンを押すとアプリがクラッシュします。私は何を間違っていますか?

skipscreen.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            SharedPreferences savestate = getSharedPreferences("skip", MODE_PRIVATE);
            savestate.edit().putBoolean("skip", true).apply();
            skip= true;
            homeintent();
        }
    });
    Thread splashthread = new Thread() {
        @Override
        public void run() {
                try {
                    sleep(3000);
                    if (!skip) { homeintent();}
                } catch (InterruptedException Interrupt) {
                    Interrupt.printStackTrace();
                }
            }
    };
    splashthread.start();
}
private void homeintent() {
    Intent i = new Intent(splash.this, home.class);
    startActivity(i);
    finish();
}
@Override
public void onBackPressed() {
    splashthread.interrupt();
    finish();
  }
}

更新: (このソリューションは私にとってはうまくいきました)。

skipscreen.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            SharedPreferences savestate = getSharedPreferences("skip", MODE_PRIVATE);
            savestate.edit().putBoolean("skip", true).apply();
            skip= true;
            homeintent();
        }
    });
    Thread splashthread = new Thread() {
        @Override
        public void run() {
                try {
                    sleep(3000);
                    if (!skip) { homeintent();}
                } catch (InterruptedException Interrupt) {
                    Interrupt.printStackTrace();
                }
            }
    };
    splashthread.start();
}
private void homeintent() {
    if (!ThreadInterrupted) {
           Intent i = new Intent(splash.this, home.class);
           startActivity(i);
   }
           finish();
}
@Override
public void onBackPressed() {
        SharedPreferences savestate= getSharedPreferences("ThreadInterrupted", MODE_PRIVATE);
        savestate.edit().putBoolean("ThreadInterrupted", true).apply();
        ThreadInterrupted = true;
        homeintent();
    }
}
4

4 に答える 4

1

簡潔な回答を提供し、今後これを行う方法を説明するには、HandlerクラスとHandler.postDelayed()メソッドを見てください。

 private Handler homeIntenthandler;
    @Override
    protected void onCreate(){

    //other things
        skipscreen.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View view) {
                SharedPreferences savestate = getSharedPreferences("skip", MODE_PRIVATE);
                savestate.edit().putBoolean("skip", true).apply();
                skip= true;
                homeintent();
            }
        });

//initialise handler and set timer;
        homeIntenthandler= new Handler();
        homeIntenthandler.postDelayed(new Runnable() {
            @Override
            public void run() {
               homeintent();
            }
        },3000);
    }
    }
    private void homeintent() {
        Intent i = new Intent(splash.this, home.class);
        startActivity(i);
        finish();
    }
    @Override
    public void onBackPressed() {
      if(homeIntenthandler!=null)
        homeIntenthandler.removeCallbacksAndMessages(null)
        finish();
      }
    }

これは、同じHandler.removeCallbacksAndMessages(null)ために提供されたドキュメントに基づいています

于 2015-09-29T18:32:13.657 に答える
0

揮発性 チェックを作成して、booleanスレッドの進行を停止できます。次のコードを参照してください。

private volatile boolean cancelled = false;

Thread splashthread = new Thread() {
    @Override
    public void run() {
            if ( cancelled ) {
              return; // or handle this however you want
            }else{
              // do what ever you want to do here
            }
        }
};
splashthread.start();

そして、onBackPressed次のようなことをします:

@Override
public void onBackPressed() {
    cancelled = true;
    finish();
}

一般に、キャンセルを実行するスレッドが、キャンセルされるスレッドと同じであるとは限らないため、volatileキーワードを使用することをお勧めします。booleancheck asをマークするvolatileと、フラグをチェックするスレッドが最新の値を確認できるようになります。

于 2015-09-29T18:29:43.857 に答える