1

有没有办法在只执行一次方法后停止运行?

我创建了这段代码来延迟方法“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 活动...

 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);


 }


 }
4

4 回答 4

1

方法 run 只执行一次。如果您希望有一个永无止境的循环,则需要包含类似while(true).
更好地描述您的问题,因为我不太了解它。是下一个活动加载两次的问题吗?在什么情况下?你能发布下一个活动的代码吗?正在加载哪个活动?InitialPreferences 还是 MainActivity?
请注意,通过在onCreateActivityonCreate

编辑 1:您遇到的主要问题是您的InitialPreference类 extends StartScreen,并且在您的onCreate方法中,您调用 super 将触发另一个 postDelayed,启动另一个 InitialPreference 等等。
您是否有任何理由扩展 StartScreen 而不是 Activity?我认为通过这种更改,您的问题将得到解决。当然,如果你正在做一个设置活动,我会建议使用 PreferenceActivity。您可以查看文档 http://developer.android.com/guide/topics/ui/settings.html

于 2013-07-23T05:06:42.787 回答
0

停止可运行对象的正确方法是终止其中的循环。在您的情况下,没有循环,因此可运行对象应该在 getPreferences() 完成运行后停止。

由于您已将其放置在 onCreate 中,因此它将在创建或重新创建活动后运行 10000 毫秒

于 2013-07-23T05:04:34.497 回答
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.

在 Activity 的 onDestroy 或 onStop 方法中,使用以下代码取消计时器。

timer.cancel();
于 2013-07-23T06:14:37.703 回答
0

通过处理和当您决定取消/中止实例发送给它时让您Runnable interrupt意识到:interruptsRunnableinterrupt

    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检查标志,以使其更能感知中断,您应该在多个点添加方法。rungetPreferences

要中断 a thread,调用者可以调用t.interruptwhere tis a Threadinstance。

于 2013-07-23T06:29:08.957 回答