【问题标题】:How to set Delay for loop in android?如何在android中设置循环延迟?
【发布时间】:2023-03-13 20:51:01
【问题描述】:

我正在尝试延迟显示乘法表。我的代码工作正常,但我无法实现延迟。

这是我的代码:

tableButton1 = (Button) findViewById(R.id.Button1);
tableButton1.setOnClickListener(new OnClickListener() {
    public void onClick(View v) {       
        new Thread(new Runnable() {
             public void run() {
                    str = tableButton1.getText().toString();  
                     a = Integer.parseInt(str);
                     StringBuilder sb = new StringBuilder();
                     for (int i = 1; i <= 10; i++){
                        sb.append(a + " x " + i + " = " + i * a+ "\n");

                     }
                     s = String.valueOf(sb);

                    Intent intent=new Intent(getApplicationContext(),TextViewActivity.class);
                    intent.putExtra("MA", s);
                    startActivity(intent);
             }
         });
         //Toast.makeText(getApplicationContext(), "Hi"  +ss, 222).show();              
    }       
}); 

任何答案都是可观的。

提前致谢

更新代码:- 此代码在@theLittleNaruto 的帮助下工作

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class TestActivity  extends Activity{
Button tableButton1;
TextView txtView; 

int value = 0; 
    static int count = 0;
    Handler handle = new Handler();

    StringBuilder sb = new StringBuilder();

    Runnable r  = new Runnable() {

        @Override
        public void run() {
            Toast.makeText(getApplicationContext(), "onrunnable" +sb, 222).show();
            // TODO Auto-generated method stub
            updateTable();
        }
    };

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                setContentView(R.layout.text_display);

                Toast.makeText(getApplicationContext(), "oncreate" , 222).show();
                txtView = (TextView) findViewById(R.id.outputTXT);
               tableButton1 = (Button) findViewById(R.id.seven);
               tableButton1.setOnClickListener(new OnClickListener() {

            public void onClick(View v) {       

                Toast.makeText(getApplicationContext(), "onclick" , 222).show();
                value= Integer.parseInt(tableButton1.getText().toString()); 
                updateTable();

            }
       });
      }


     public void updateTable(){

        count+=1000;
        if(count==11000){
            //Toast.makeText(getApplicationContext(), "onupdate" , 222).show();
            count = 0;
            value=0;
            handle.removeCallbacks(r);
            sb.setLength(0);

        }else{

            sb.append(value + " x " + count/1000 + " = " + count/1000 * value+ "\n");
                        handle.postDelayed(r, 1000);
                       // Toast.makeText(getApplicationContext(), "onupdateElse" +sb, 222).show();
                        txtView.setText(sb);
        }


    }


}

感谢所有的支持者和他们尽力帮助我的努力

【问题讨论】:

  • 您想要在乘法之间或在乘法开始之前有延迟吗?
  • 我想在乘法之间延迟..
  • 那么您可以像在某些答案中那样使用计时器

标签: android multithreading android-handler


【解决方案1】:

你为什么不花点力气试试别人说的话;)

public class TestActivity extends Activity{

int value = 0; 
    static int count = 0;
    Handler handle = new Handler();

    StringBuilder sb = new StringBuilder();

    Runnable r  = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            updateTable();
        }
    };

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                setContentView(R.layout.oaot_get);


               tableButton1.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {       


                value= Integer.parseInt(tableButton1.getText().toString()); 
                updateTable();

            }
       });
      }


     public void updateTable(){

        count+=1000;
        if(count==11000){

            count = 0;
            value=0;
            handle.removeCallbacks(r);
            sb.setLength(0);

        }else{

            sb.append(value + " x " + count/1000 + " = " + count/1000 * value+ "\n");
                        handle.postDelayed(r, 1000);

        }


    }


}

【讨论】:

  • 我需要一些额外的帮助来解决如何在数字之间获得延迟的问题。
  • 你可以自己做。冷静下来思考一下。这很简单,伙计
【解决方案2】:

试试这个....

    do {
        try {
            try {
                response_req_sequence = SimpleHttpClient
                        .sendresponseSequReqRes(response_send_order);
                System.out.println("response of sequence request"
                        + response_req_sequence);
                System.out.println(" i  ma in thread");
                if (response_req_sequence.trim().length() != 0) {
                    System.out.println("response in result of sequ"+ response_req_sequence);
                    break;
                }
                Thread.sleep(10000);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        } catch (Exception e) {
            // TODO: handle exception
        }
    } while (response_req_sequence.trim().equalsIgnoreCase(""));

这对我来说很好用。可以根据自己的情况进行定制。

【讨论】:

    【解决方案3】:

    你可以使用它:

    public class Scheduler {
    
    // DATA
    private OnScheduleTimeListener  mListener;
    private Handler                 mHandler;
    private int                     mInterval;          // Between each executions
    private static final int        DELAY   = 100;      // before first execution
    private boolean                 mIsTimerRunning;
    
    public static interface OnScheduleTimeListener {
    
        public void onScheduleTime();
    }
    
    public Scheduler(int interval) {
        super();
        mInterval = interval;
        mHandler = new Handler();
    }
    
    private final Runnable  mRunnable   = new Runnable() {
    
                                            @Override
                                            public void run() {
                                                // Do stuff
                                                mListener.onScheduleTime();
                                                // Repeat
                                                mHandler.postDelayed(mRunnable, mInterval);
                                            }
                                        };
    
    public void setOnScheduleTimeListener(OnScheduleTimeListener listener) {
        mListener = listener;
    }
    
    public void startTimer() {
        mIsTimerRunning = true;
        mHandler.postDelayed(mRunnable, DELAY);
    }
    
    public void stopTimer() {
        mIsTimerRunning = false;
        mHandler.removeCallbacks(mRunnable);
    }
    
    public boolean isTimerRunning() {
        return mIsTimerRunning;
    }
    }
    

    现在使用它:

    private void startTimer() {
            mScheduler = new Scheduler(INTERVAL);
            mScheduler.setOnScheduleTimeListener(new OnScheduleTimeListener() {
    
            @Override
            public void onScheduleTime() {
                    Log.d(TAG, "update");
            });
            mScheduler.startTimer();
    }
    
    private void stopTimer(){
        if (mScheduler != null && mScheduler.isTimerRunning()) {
            mScheduler.stopTimer();
            mScheduler = null;
        }
    }
    

    【讨论】:

    • 这是一个简单的解决方案,仅使用不会冻结线程的 postDelayed。我用它来进行小的 ui 更新,比如每 30 秒(延迟和时间都以毫秒为单位)
    【解决方案4】:

    试试这个

    Timer timer = new Timer();
    timer.schedule(new TimerTask() {
        public void run() {
            str = tableButton1.getText().toString();  
            a = Integer.parseInt(str);
            StringBuilder sb = new StringBuilder();
            for (int i = 1; i <= 10; i++){
                sb.append(a + " x " + i + " = " + i * a+ "\n");
            }
        }, 5000);
    s = String.valueOf(sb);
    
    Intent intent=new Intent(getApplicationContext(),TextViewActivity.class);
    intent.putExtra("MA", s);
    startActivity(intent);
    

    【讨论】:

      【解决方案5】:

      添加一个Handler 来执行你的runnable:

      Runnable runnable = new Runnable() {
          @Override
          public void run() {
              str = tableButton1.getText().toString();  
              a = Integer.parseInt(str);
              StringBuilder sb = new StringBuilder();
              for (int i = 1; i <= 10; i++){
                  sb.append(a + " x " + i + " = " + i * a+ "\n");
      //--ADDED stuff here------------------------------------------------------------
                  try {
                     //Sleep will suspend your Thread for 500 miliseconds and resumes afterwards
                      Thread.sleep(500);
                  } catch (InterruptedException e) {
                      Log.e("error, Thread interrupted", e);
                  }
              }
              s = String.valueOf(sb);
      
              Intent intent=new Intent(getApplicationContext(),TextViewActivity.class);
              intent.putExtra("MA", s);
              startActivity(intent);
          }
      Handler handler = new Handler();
      //this will execute your runnable after 500 milliseconds
      handler.postDelayed(runnable, 500);
      

      【讨论】:

      • 欢迎!!我之前试过,但我可以在我的表开始时延迟,但我想在我的乘法表内延迟。
      • @Chandan :我在代码中添加了一个编辑来延迟循环中的每一步。
      • 我试图在我的点击按钮上实现,但是当我使用这一行 handler.postDelayed(runnable, 500);它开始给我错误..所有行都是红色的。
      【解决方案6】:

      添加一个处理程序()。将您的 onClick 代码替换为:

      final Handler handler = new Handler();
              handler.postDelayed(new Runnable() {
                  @Override
                  public void run() {
                       str = tableButton1.getText().toString();  
                              a = Integer.parseInt(str);
                              StringBuilder sb = new StringBuilder();
                              for (int i = 1; i <= 10; i++) 
                              {
                                  sb.append(a + " x " + i + " = " + i * a+ "\n");
      
                              }s=String.valueOf(sb);
      
      
                              Intent intent=new Intent(getApplicationContext(),TextViewActivity.class);
                              intent.putExtra("MA", s);
                              startActivity(intent);
                           }
          }, 5000);
      

      将 5000 替换为您希望延迟的时间(以毫秒为单位)

      【讨论】:

      • 欢迎!!我试过了,但我想在乘法表中延迟。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 2023-04-03
      • 2020-07-08
      • 1970-01-01
      • 2015-05-17
      • 2011-05-11
      相关资源
      最近更新 更多