如何在android中设置Delay for loop?

时间:2014-01-24 08:58:59

标签: android multithreading android-handler

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

这是我的代码:

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


    }


}

感谢所有支持者和他们最好的帮助我的尝试

6 个答案:

答案 0 :(得分:5)

为什么不用这个小小的努力尝试对方说的话;)

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

        }


    }


}

答案 1 :(得分:2)

试试这个

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

答案 2 :(得分:1)

添加处理程序()。将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替换为您希望延迟的时间(以毫秒为单位)

答案 3 :(得分:1)

添加将执行runnable的Handler

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

答案 4 :(得分:0)

您可以使用:

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

答案 5 :(得分:0)

试试这个......

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

这对我来说很好。你可以根据你自己定制。