Why can I get "Cannot create a handler inside a thread that did not call Looper.prepare ()" using android.os.CountDownTimer?

When using this class, I get this strange exception. It is used to print a nice timer display for my game and is created when my main GameView class is created. The error falls on line 26: super (s * 1000,1000);

package tommedley.android.game;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.os.CountDownTimer;

public class Timer extends CountDownTimer{
    public static int MODE_COUNTING = 0;
    public static int MODE_PAUSED = 1;
    public static int MODE_FINISHED = 2;

    private Canvas canvas;
    private Context context;
    private float xPos;
    private float yPos;
    private static int DIGIT_WIDTH = 50;
    private static int DIGIT_HEIGHT = 70;
    private int numDigits = 3;
    private int seconds;
    Drawable[] digitImgs;
    private int mode;


    public Timer(Canvas c, Context con, float x, float y, int digits, int s){
        super(s*1000, 1000);
        mode = MODE_COUNTING;
        canvas = c;
        context = con;
        xPos = x;
        yPos = y;
        seconds = s;
        numDigits = digits;
        digitImgs = new Drawable[numDigits];
        this.start();
    }
    public void draw(){
        String reprNum = String.format("%0"+numDigits+"d", seconds);
        for(int i = 0;i<numDigits;i++){
            switch(reprNum.charAt(i)){
            case '0':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_0);
                break;
            case '1':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_1);
                break;
            case '2':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_2);
                break;
            case '3':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_3);
                break;
            case '4':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_4);
                break;
            case '5':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_5);
                break;
            case '6':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_6);
                break;
            case '7':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_7);
                break;
            case '8':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_8);
                break;
            case '9':
                digitImgs[i] = context.getResources().getDrawable(R.drawable.digit_9);
                break;
            }
            digitImgs[i].setBounds((int)xPos+DIGIT_WIDTH*i, (int)yPos, (int)xPos+DIGIT_WIDTH*(i+1), (int)yPos+DIGIT_HEIGHT);
            digitImgs[i].draw(canvas);
        }
    }
    @Override
    public void onFinish() {
        seconds = 0;
        mode = MODE_FINISHED;
    }
    @Override
    public void onTick(long millsLeft) {
        seconds = (int)millsLeft / 1000;
    }
    public int getMode(){
        return mode;
    }
}
+3
source share
1 answer

This is a bit strange - I think you should create this object in a thread other than the main thread?

, Handlers Loopers, Android- . , . , , MessageQueue, Looper.prepare().

CountDownTimer, , Handler . - , super.

, , , Looper.prepare(), . , . Android ( , ). javadocs, , . onTick , .

+5

Source: https://habr.com/ru/post/1758535/


All Articles