停止运行

时间:2013-07-23 05:01:26

标签: android loops handler delay runnable

有没有办法在只执行一次方法后停止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);


 }


 }

4 个答案:

答案 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,其中tThread个实例。