有没有办法在只执行一次方法后停止runnable?
我已创建此代码以延迟方法“getPreferences”的启动但是当我运行应用程序时,我的下一个“getPreferences”发送给我的活动会给出屏幕刷新的问题吗? 这是否仍然继续循环运行?如何在执行一次后将其杀死?
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.view.Menu;
public class StartScreen extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start_screen);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getPreferences();
}}, 10000);
}
private void getPreferences() {
// TODO Auto-generated method stub
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
String name = sharedPreferences.getString("NAME", "");
if (name != null) {
// the key does not exist
Intent intent=new Intent(StartScreen.this,InitialPreferences.class);
startActivity(intent);
}
if (name == "NAME"){
// handle the value
Intent intent=new Intent(StartScreen.this,MainActivity.class);
startActivity(intent);
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.start_screen, menu);
return true;
}
}
InitialPreferences avtivity ....
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
public class InitialPreferences extends StartScreen implements OnClickListener {
EditText editText1;
Button button1;
TextView textView1;
RadioGroup radioGroup;
RadioButton radioPosistionButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.initial_preferences);
// waitTimer.cancel();
textView1 = (TextView)findViewById(R.id.textView1);
editText1 = (EditText)findViewById(R.id.editText1);
button1 = (Button)findViewById(R.id.button1);
radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
}
@Override
protected void onStart(){
//waitTimer.cancel();
LoadPreferences();
super.onStart();
}
private void SavePreferences(String key, String value){
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString(key, value);
editor.commit();
}
private void LoadPreferences(){
SharedPreferences sharedPreferences = getPreferences(MODE_PRIVATE);
String name = sharedPreferences.getString("NAME", "");
textView1.setText(name);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
SavePreferences("NAME", editText1.getText().toString());
// get selected radio button from radioGroup
int selectedId = radioGroup.getCheckedRadioButtonId();
// find the radio button by returned id
radioPosistionButton = (RadioButton) findViewById(selectedId);
}
}
答案 0 :(得分:1)
方法运行仅执行一次。如果您希望进行无休止的循环,则需要包含类似while(true)
的内容
更好地描述你的问题,因为我不太了解它。下一个活动加载两次的问题是什么?在什么情况下?你可以发布下一个活动的代码吗?正在加载哪项活动? InitialPreferences或MainActivity?
请注意,通过在活动的onCreate
中包含代码,每次重新创建活动时都会执行一次(例如,当您将手机从横向更改为肖像时,活动会重新创建,再次致电onCreate
。)
编辑1:
您遇到的主要问题是InitialPreference
类扩展StartScreen
,而您的onCreate
方法中,您调用super会触发另一个postDelayed,启动另一个InitialPreference,依此类推。
你有什么理由扩展StartScreen而不是Activity吗?我认为通过这一改变,你的意志将解决你的问题。当然,如果您正在进行设置活动,我建议使用PreferenceActivity。您可以查看documentation http://developer.android.com/guide/topics/ui/settings.html
答案 1 :(得分:0)
停止runnable的正确方法是终止其中的循环。在你的情况下,没有循环,所以runnable应该在getPreferences()完成运行后停止。
由于您已将其置于onCreate中,因此在创建或重新创建活动后将运行10000毫秒
答案 2 :(得分:0)
使用Timer和TimerTask进行重复性任务。
见下面的代码。它适用于我。
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// use handler here.
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
getPreferences();
}
});
}
},100000) // second parameter of scheduleAtFixedRate() method is Time in MilliSecond
Specify the time interval here for repepititive execution.
在onDestroy或onStop活动方法中,使用以下代码取消计时器。
timer.cancel();
答案 3 :(得分:0)
通过处理Runnable
并在您决定取消/中止interrupt
实例发送interrupts
时,让Runnable
interrupt
知道:
run() {
..
if(Thread.currentThread().isInterrupted()) {
//thread is interrupt, abort run method, either by returning or throwing InterruptedException
return;
//OR
throw new InterruptedException("Explicit abort signal!");
}else {
//continue your work
}
}
通常在interrupt
方法(以及循环中)的多个位置检查run
标志,以使其更具中断识别能力,您应该在多个点添加getPreferences
方法
要中断thread
,来电者可以调用t.interrupt
,其中t
是Thread
个实例。