0

私はAndroidの初心者で、アプリケーションを作成しましたが、ボタンのクリックで同じアクティビティを開始するとクラッシュし、現在Activityのエラーログもここで終了します。私はTimer自分のアプリケーションとバックグラウンドミュージックでも使用しています

12-18 05:55:15.776: D/AndroidRuntime(2345): Shutting down VM
12-18 05:55:15.776: W/dalvikvm(2345): threadid=1: thread exiting with uncaught exception (group=0x40a13300)
12-18 05:55:15.817: E/AndroidRuntime(2345): FATAL EXCEPTION: main
12-18 05:55:15.817: E/AndroidRuntime(2345): android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.BinderProxy@41542480 is not valid; is your activity running?
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.view.ViewRootImpl.setView(ViewRootImpl.java:585)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:326)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.view.Window$LocalWindowManager.addView(Window.java:547)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.app.Dialog.show(Dialog.java:277)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at com.example.whowantto.play$timer.onFinish(play.java:722)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.os.CountDownTimer$1.handleMessage(CountDownTimer.java:118)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.os.Looper.loop(Looper.java:137)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at android.app.ActivityThread.main(ActivityThread.java:4745)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at java.lang.reflect.Method.invokeNative(Native Method)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at java.lang.reflect.Method.invoke(Method.java:511)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-18 05:55:15.817: E/AndroidRuntime(2345):     at dalvik.system.NativeStart.main(Native Method)
12-18 05:55:57.476: E/Trace(2564): error opening trace file: No such file or directory (2)
12-18 05:55:57.546: D/AndroidRuntime(2564): Shutting down VM

前もって感謝します

4

2 に答える 2

0

ライフサイクルが終了した後CountDownTimerに表示しようとしています。たぶん、あなたは電話をかけていますが、仕事をしていません。AlertDialogActivityfinish()cancel()

以下のサンプルのようにダイアログを表示する必要がある場合は、タイマーによってチェックされる変数を追加できます

public class TimerActivity extends Activity {

    private boolean mDialogEnabled;

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

        // add timer start to some button
        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new CountDownTimer(5000, 1000) {
                    @Override
                    public void onTick(long millisUntilFinished) {
                        // something
                    }

                    @Override
                    public void onFinish() {
                        if (mDialogEnabled) // <<< check
                            new AlertDialog.Builder(TimerActivity.this)
                                .show();
                    }
                }.start();
            }
        });
    }

    // enable/disable showing the dialog in start / stop for example

    @Override
    protected void onStart() {
        super.onStart();
        mDialogEnabled = true;
    }

    @Override
    protected void onStop() {
        super.onStop();
        mDialogEnabled = false;
    }
}

または、タイマー タスクを保持し、次の例のように次のアクティビティ インスタンスに再アタッチする、より洗練された実装を使用することもできます。このようにして、たとえばローテーションでアクティビティを再作成し、古いアクティビティ インスタンスで開始されたタイマーを引き続き使用できます。

public class TimerActivity extends Activity {

    static class MyCountDownTimer extends CountDownTimer {
        private Context mContext;
        public MyCountDownTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        public void setContext(Context context) {
            mContext = context;
        }

        @Override
        public void onFinish() {
            if (mContext != null) {
                new AlertDialog.Builder(mContext)
                    .setMessage("Finished!")
                    .show();
            }
        }
        @Override
        public void onTick(long millisUntilFinished) {
            if (mContext != null) {
                // do something
            }
        }
    }

    MyCountDownTimer mTimer;

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

        // restore timer to current Activity
        mTimer = (MyCountDownTimer) getLastNonConfigurationInstance();

        // add timer start to some button
        findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // cancel old timers
                if (mTimer != null) {
                    mTimer.cancel();
                }
                mTimer = new MyCountDownTimer(5000, 1000);
                mTimer.start();
            }
        });

    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        // save timer and detach from Activity
        if (mTimer != null) {
            mTimer.setContext(null);
        }
        return mTimer;
    }

    @Override
    protected void onStart() {
        super.onStart();
        // Activity going to be visible now, attach timer
        if (mTimer != null)
            mTimer.setContext(this);
    }

    @Override
    protected void onStop() {
        super.onStop();
        // Activity going to be invisible, detach timer
        if (mTimer != null) {
            mTimer.setContext(null);
            // if activity is not to be recreated cancel it
            if (isFinishing()) {
                mTimer.cancel();
                mTimer = null;
            }
        }
    }
}

すべてのコードはテストされていませんが、大まかに動作するはずです。

于 2012-12-17T14:54:03.160 に答える
0

現在のDialog呼び出し後に表示しようとしているようですfinish()Activity

于 2012-12-17T12:45:38.700 に答える