0

I made simple picture matching game with four Activities After finishing you can play again. The problem is most of the time the game stops and return to previous

The error:

2020-01-29 15:05:51.001 11438-11438/? E/AndroidRuntime: FATAL EXCEPTION: main Process: com.mk_kadish.playandlearn, PID: 11438 android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@4f4586f is not valid; is your activity running? at android.view.ViewRootImpl.setView(ViewRootImpl.java:798) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) at android.app.Dialog.show(Dialog.java:329) at androidx.appcompat.app.AlertDialog$Builder.show(AlertDialog.java:1007) at com.mk_kadish.playandlearn.game1.game1_HomeActivity$4.onFinish(game1_HomeActivity.java:284) at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:127) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

The Code of one of the files and the other repeats the same:

public class game1_HomeActivity extends AppCompatActivity {

    private AllSharedPrefernces allSharedPrefernces;
    View view1;
    int position1;
    private int height;
    private int width;
    private static final long START_TIME_IN_MILLIS = 120000;
    private TextView mTextViewCountDown;
    private  TextView textViewPairs;
    private Button mButtonStartPause;
    private Button mButtonReset;
    private CountDownTimer mCountDownTimer;
    private Long pointsCounter;
    private boolean mTimerRunning;
    private long mTimeLeftInMillis = START_TIME_IN_MILLIS;
    ArrayList<Game1KeyValue> allpairs;
    boolean isMatch=false;
    ImageAdapter imageAdapter2;
    ImageView curView = null;
    private int countPair = 0;
    TextView tv6;
    TextView myPoints;
    TextView temPoints;
    public int[] drawable;
    int[] pos;
    int maxnum=2;
    int currentPos = -1;
    MediaPlayer mediaPlayerno_ar;
    MediaPlayer mediaPlayer_no;
    MediaPlayer mediaPlayeryes;
    MediaPlayer mediaPlayeryes_ar;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        allSharedPrefernces = new AllSharedPrefernces(this);
        setContentView(R.layout.activity_game1__home);

        drawable=new int[]
                {
                        R.drawable.yes_ar,
                        R.drawable.no_ar,
                        R.drawable.no,
                        R.drawable.yes,
                };

        pos=TawleedRandom.walledArray(4);
        allpairs = new ArrayList<>();
        allpairs.add(new Game1KeyValue(R.drawable.yes,R.drawable.yes_ar));
        allpairs.add(new Game1KeyValue(R.drawable.no ,R.drawable.no_ar));
        temPoints=findViewById(R.id.l1g1_tempoints);

        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        height = displayMetrics.heightPixels;
        width = displayMetrics.widthPixels;
        tv6 = findViewById(R.id.g2_tv4_pairsCount);
        myPoints=findViewById(R.id.g2_tv6_Ponits);
        pointsCounter=getPoints();
        myPoints.setText(pointsCounter+"");
        pointsCounter=0L;
        tv6.setText(""+drawable.length /2);
        mTextViewCountDown = findViewById(R.id.g1_tv2_text_view_countdown);
        textViewPairs=findViewById(R.id.g1_tv2_pairsCount);
        mButtonStartPause = findViewById(R.id.button_start_pause);
        mButtonReset = findViewById(R.id.button_reset);
        mButtonStartPause.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (mTimerRunning) {
                    pauseTimer();
                } else {
                    startTimer();
                }
            }
        });

        mButtonReset.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                playAgain(v);
            }
        });
        updateCountDownText();

        final ImageAdapter imageAdapter = new ImageAdapter(this,height,width,drawable.length);
        GridView gridView = findViewById(R.id.gridView);
        gridView.setNumColumns(2);
        gridView.setEnabled(false);
        RelativeLayout.LayoutParams parameter =  (RelativeLayout.LayoutParams) gridView.getLayoutParams();
        parameter.setMargins(width * 2 /7, parameter.topMargin, parameter.rightMargin, parameter.bottomMargin); // left, top, right, bottom
        gridView.setLayoutParams(parameter);
        gridView.setAdapter(imageAdapter);
        gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (currentPos < 0) {
                    currentPos = position;
                    curView = (ImageView) view;
                    runSuitableMusika(drawable[pos[position]]);
                    ((ImageView) view).setImageResource(drawable[pos[position]]);
                    view1 = view;
                    position1 = position;
                } else
                    {
                    if (currentPos == position)
                    {
                        ((ImageView) view).setImageResource(R.drawable.questionbg);
                    }
                    else
                        {
                            runSuitableMusika(drawable[pos[position]]);
                        for (Game1KeyValue d : allpairs) {
                            if ((d.key == drawable[pos[currentPos]]) || (d.value == drawable[pos[currentPos]])) {
                                if (d.key == drawable[pos[currentPos]]) {
                                    if (d.value == drawable[pos[position]]) {
                                        isMatch = true;
                                        d.setUsed(1);
                                    }
                                    break;
                                } else {
                                    if (d.value == drawable[pos[currentPos]]) {
                                        if (d.key == drawable[pos[position]]) {
                                            isMatch = true;
                                        }
                                        break;
                                    }
                                }
                            }
                        }

                        ((ImageView) view).setImageResource(drawable[pos[position]]);
                        view1 = view;

                        if (!isMatch) {
                            Handler handler = new Handler();
                            handler.postDelayed(new Runnable() {
                                @Override
                                public void run() {
                                    curView.setImageResource(R.drawable.questionbg);
                                    ((ImageView) view1).setImageResource(R.drawable.questionbg);
                                }
                            }, 600);
                        }
                        else if (isMatch) {
                            isMatch = false;
                            ((ImageView) view).setImageResource(drawable[pos[position]]);
                            runSuitableMusika(drawable[pos[position]]);
                            countPair++;
                            pointsCounter=pointsCounter+1L;
                            temPoints.setText(pointsCounter+"");
                            textViewPairs.setText(countPair + "");
                            if(countPair != maxnum)
                            {
                                int curNum=drawable.length;
                                int[] newArray = new int[curNum-2];
                                int[] pos1=TawleedRandom.walledArray(curNum-2);
                                int k=0;
                                for(int i=0;i<curNum;i++)
                                {
                                    if(i==position || i==currentPos)
                                    {

                                    }
                                    else
                                    {
                                        newArray[pos1[k]] = drawable[pos[i]];
                                        k++;
                                    }
                                }
                                drawable=newArray;
                                pos=pos1;

                                Handler handler = new Handler();
                                handler.postDelayed(new Runnable() {
                                    @Override
                                    public void run() {
                                        removeFromGrid();
                                    }
                                }, 1000);
                            }
                            else
                            if (countPair == maxnum) {


                                try
                                {
                                    Thread.sleep(500);
                                }
                                catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                passToNext(view);
                            }
                            try {
                                Thread.sleep(500);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                    currentPos = -1;
                }
            }
        });
    }

    private void removeFromGrid()
    {
        GridView gridView = findViewById(R.id.gridView);
        gridView.setAdapter(null);
        imageAdapter2=new ImageAdapter(this,height,width,drawable.length);
        gridView.setNumColumns(2);
        gridView.setAdapter(imageAdapter2);
        currentPos = -1;
    }

    private void startTimer() {
        mCountDownTimer = new CountDownTimer(mTimeLeftInMillis, 1000) {
            @Override
            public void onTick(long millisUntilFinished) {
                mTimeLeftInMillis = millisUntilFinished;
                updateCountDownText();
            }

            @Override
            public void onFinish() {
                GridView gridView0 = findViewById(R.id.gridView);
                gridView0.setVisibility(View.INVISIBLE);
                Button btn2=findViewById(R.id.button_start_pause);
                btn2.setVisibility(View.INVISIBLE);

                AlertDialog.Builder builder = new AlertDialog.Builder(game1_HomeActivity.this);
                builder.setCancelable(true);
                builder.setTitle("            انتهت اللعبة                        ");
                builder.setMessage("حظ أوفر المرة القادمة");
                builder.setNegativeButton("الخروج من اللعبة", new DialogInterface.OnClickListener(){
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                       backToFirstMethod();
                    }
                });

                builder.setPositiveButton("العب مرة أخرى", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialogInterface, int i) {
                        Intent intent = getIntent();
                        finish();
                        startActivity(intent);
                    }
                });
                builder.show();
            }
        }.start();
        mTimerRunning = true;
        mButtonStartPause.setText("إيقاف مؤقت");
        mButtonReset.setVisibility(View.INVISIBLE);
        GridView gridView = findViewById(R.id.gridView);
        gridView.setNumColumns(2);
        gridView.setEnabled(true);
    }

    private void pauseTimer() {
        mCountDownTimer.cancel();
        mTimerRunning = false;
        mButtonStartPause.setText("استئناف");
        mButtonReset.setVisibility(View.VISIBLE);
        GridView gridView = findViewById(R.id.gridView);
        gridView.setNumColumns(2);
        gridView.setEnabled(false);
    }

    private void updateCountDownText() {
        int minutes = (int) (mTimeLeftInMillis / 1000) / 60;
        int seconds = (int) (mTimeLeftInMillis / 1000) % 60;
        String timeLeftFormatted = String.format(Locale.getDefault(), "%02d:%02d", minutes, seconds);
        mTextViewCountDown.setText(timeLeftFormatted);
    }

    public void passToNext(View view)
    {
        allSharedPrefernces.writeTimer1(mTimeLeftInMillis);
        allSharedPrefernces.saveDbPoints(getPoints());
        allSharedPrefernces.storeTempPoints(2L);

        startActivity(new Intent(this,game1_secondActivity.class));
        finish();
    }

    public void playAgain(View view)
    {
        Intent intent = getIntent();
        finish();
        startActivity(intent);
    }

    public void backToFirstMethod()
    {
        startActivity(new Intent(this, indexActivity.class));
        finish();
    }

    public Long getPoints()
    {
        SchoolDbHelper schoolDbHelper=new SchoolDbHelper(this);
        SQLiteDatabase mydatabase=schoolDbHelper.getReadableDatabase();
        Long c= schoolDbHelper.getCurrentPoints(11,mydatabase);
        return c;
    }
Markus Kauppinen
  • 3,025
  • 4
  • 20
  • 30
kaarido
  • 3
  • 3

2 Answers2

0

Your exceptions shows that you are calling activity that is destroyed or vice versa. Make sure there is no activity or dialog that is called after destroying that activity. For more information Check following link

Bad window token, you cannot show a dialog before an Activity is created or after it's hidden

S.Ambika
  • 292
  • 1
  • 14
  • Thank you , but I can't recognize the problem location exactly. – kaarido Jan 29 '20 at 08:08
  • Problem is supposed to occur when app stops and restart again – S.Ambika Jan 29 '20 at 08:55
  • `android.app.Dialog.show(Dialog.java:329) at androidx.appcompat.app.AlertDialog$Builder.show(AlertDialog.java:1007) at com.mk_kadish.playandlearn.game1.game1_HomeActivity$4.onFinish(game1_HomeActivity.java:284` Look at this – S.Ambika Jan 29 '20 at 08:56
0

you are trying to show the dialog for a context that no longer exists.

try using this in side your onFinish() method of startTimer()

AlertDialog.Builder builder = new AlertDialog.Builder(getActivity().this);

Also check if activity is visible, like, e.g.

if (getActivity().hasWindowFocus()) {
// create & show dialog here
}
Rohit J
  • 107
  • 7