programing

안드로이드의 지연은 어떻게 설정하나요?

projobs 2022. 8. 27. 23:24
반응형

안드로이드의 지연은 어떻게 설정하나요?

public void onClick(View v) {
        // TODO Auto-generated method stub
        switch(v.getId()){
        case R.id.rollDice:
            Random ranNum = new Random();
            int number = ranNum.nextInt(6) + 1;
            diceNum.setText(""+number);
            sum = sum + number;
            for(i=0;i<8;i++){
                for(j=0;j<8;j++){

                    int value =(Integer)buttons[i][j].getTag();
                    if(value==sum){
                        inew=i;
                        jnew=j;

                        buttons[inew][jnew].setBackgroundColor(Color.BLACK);
                                                //I want to insert a delay here
                        buttons[inew][jnew].setBackgroundColor(Color.WHITE);
                         break;                     
                    }
                }
            }


            break;

        }
    }

배경 변경 사이의 명령어 지연을 설정하고 싶다.나는 스레드 타이머를 사용해 보고 런앤캐치를 사용해 보았다.근데 안 되네.이거 먹어봤어

 Thread timer = new Thread() {
            public void run(){
                try {
                                buttons[inew][jnew].setBackgroundColor(Color.BLACK);
                    sleep(5000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

             }
           };
    timer.start();
   buttons[inew][jnew].setBackgroundColor(Color.WHITE);

하지만 검정색으로 바뀌기만 하고 있어요.

다음 코드를 사용해 보십시오.

import android.os.Handler;
...
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        // Do something after 5s = 5000ms
        buttons[inew][jnew].setBackgroundColor(Color.BLACK);
    }
}, 5000);

사용할 수 있습니다.CountDownTimer이는 게시된 다른 솔루션보다 훨씬 더 효율적입니다.또한 다음 명령을 사용하여 중간 간격으로 정기적인 알림을 생성할 수도 있습니다.onTick(long)방법

이 예에서는 30초 카운트다운을 보여 줍니다.

   new CountDownTimer(30000, 1000) {
         public void onFinish() {
             // When timer is finished 
             // Execute your code here
     }

     public void onTick(long millisUntilFinished) {
              // millisUntilFinished    The amount of time until finished.
     }
   }.start();

앱에서 지연을 자주 사용하는 경우 이 유틸리티 클래스를 사용하십시오.

import android.os.Handler;


public class Utils {

    // Delay mechanism

    public interface DelayCallback{
        void afterDelay();
    }

    public static void delay(int secs, final DelayCallback delayCallback){
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                delayCallback.afterDelay();
            }
        }, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds.
    }
}

사용방법:

// Call this method directly from java file

int secs = 2; // Delay in seconds

Utils.delay(secs, new Utils.DelayCallback() {
    @Override
    public void afterDelay() {
        // Do something after delay

    }
});

사용방법Thread.sleep(millis)방법.

UI에서 정기적으로 작업을 수행하려면 CountDownTimer를 사용하는 것이 좋습니다.

new CountDownTimer(30000, 1000) {

     public void onTick(long millisUntilFinished) {
         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
     }

     public void onFinish() {
         mTextField.setText("done!");
     }
  }.start();

핸들러 응답(Kotlin):

1-파일(예를 들어 여러분들의 모든 최상위 기능이 포함된 파일)안에 있는 최상위 함수 만들기:.

fun delayFunction(function: ()-> Unit, delay: Long) {
    Handler().postDelayed(function, delay)
}

2-그럼 어느 곳에서든지 그것이 필요했죠를.

delayFunction({ myDelayedFunction() }, 300)

이 사용할 수 있습니다.

import java.util.Timer;

그리고 지연 자체에:을 더한다.

 new Timer().schedule(
                    new TimerTask(){
                
                        @Override
                        public void run(){
                            
                        //if you need some code to run when the delay expires
                        }
                        
                    }, delay);

delay가변 밀리초 단위로;예 집합을 위한 것이다.delay려면 50005-second다

여기서 다른 사람으로부터 한에는 2실링 6팬스의 인지 fadein 이 두가지 방법-원래의 이미지의 2초씩 소멸로 2이미지로 2두번째 알파 페이드 지연과 배경 이미지 바뀐 예가 있습니다.

    public void fadeImageFunction(View view) {

    backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
    backgroundImage.animate().alpha(0f).setDuration(2000);

    // A new thread with a 2-second delay before changing the background image
    new Timer().schedule(
            new TimerTask(){
                @Override
                public void run(){
                    // you cannot touch the UI from another thread. This thread now calls a function on the main thread
                    changeBackgroundImage();
                }
            }, 2000);
   }

// this function runs on the main ui thread
private void changeBackgroundImage(){
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
            backgroundImage.setImageResource(R.drawable.supes);
            backgroundImage.animate().alpha(1f).setDuration(2000);
        }
    });
}

나는 이 가장 안정적이고 가장 유용한 방식으로 2020년으로 쉬운 방법을 이용하는 것 같습니다delayRunnable이 아닌 Coroutines의 함수입니다.Coroutines는 비동기 작업과 그 작업을 처리하는 데 좋은 개념입니다.delay구성 요소가 될 것이다 이 대답의 초점을 맞추고 있다.

경고:Coroutines고 코틀린에 코드를 변환하지 않고 있다고 했지만 제 생각엔 모든 사람들이 주요 concept. 이해할 수 있어요 코틀린언어가 필요합니다.

당신의에 Coroutines을 첨가한다.build.gradle:

implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'

당신이 그것에 있는 coroutines를 사용할 것이다 너의 반(활동, 조각 또는 무언가를):직업을 넣으세요.

private var job: Job = Job()
override val coroutineContext: CoroutineContext
    get() = Dispatchers.Main + job

그리고, 그건 아무것도 수업 시간에 launch{}몸을 사용하여 Coroutines 사용할 수 있다.코드를 다음과 같이 쓸 수 있습니다.

public void onClick(View v) {

    launch {

        switch(v.getId()) {
            case R . id . rollDice :
            Random ranNum = new Random();
            int number = ranNum . nextInt (6) + 1;
            diceNum.setText("" + number);
            sum = sum + number;
            for (i= 0;i < 8;i++){
                for (j= 0;j < 8;j++){
                    int value =(Integer) buttons [i][j].getTag();
                    if (value == sum) {
                        inew = i;
                        jnew = j;

                        buttons[inew][jnew].setBackgroundColor(Color.BLACK);
                        delay(2000)
                        buttons[inew][jnew].setBackgroundColor(Color.WHITE);
                        break;
                    }
                }
        }
            break;

        }
    }
}

이게 다...

잊지 마세요launch{}함수는 비동기이며 for 루프는 대기하지 않습니다.delay다음과 같이 쓰면 종료되는 함수:

launch{
    buttons[inew][jnew].setBackgroundColor(Color.BLACK);
    delay(2000)
    buttons[inew][jnew].setBackgroundColor(Color.WHITE);
}

그렇게,launch{ }모든 for 루프가 대기하도록 하려면 for 루프를 커버해야 합니다.delay.

또 다른 장점launch{ }for 루프를 비동기화하는 것입니다.즉, 부하가 높은 프로세스에서는 애플리케이션의 메인 UI 스레드가 차단되지 않습니다.

package com.viraj.myamppractice;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.util.Random;

public class Question6 extends AppCompatActivity {

    TextView diceop;
    Button roll;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_question6);

        roll = findViewById(R.id.rollButton);
        diceop = findViewById(R.id.opDice);
        Thread timer = new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(5000);
                    Random no = new Random();
                    int number = no.nextInt(6)+1;
                    String str = String.valueOf(number);

                    diceop.setText(str);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        };

        roll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                timer.run();


            }
        });


    }
}

언급URL : https://stackoverflow.com/questions/15874117/how-to-set-delay-in-android

반응형