0

私のアプリケーションでは、アプリケーションを起動するたびに、php スクリプトを実行し、それに応じてアプリケーションをロードしたいと考えています。したがって、静的ブール変数を作成しました

boolean firstRun = false;

私の onStart では、次のコードを追加します。

// If images need to be downloaded, call SProgressAsyncTask class
    public void onStart() {
    super.onStart();

    if (firstRun) {
        sat = new SProgressAsyncTask(this);
        sat.execute("");

        firstRun = false;
    }
}

Sony の友人のデバイスでは、完全に動作します。つまり、上記のコードは一度だけ実行されます。つまり、アプリケーションの開始です。私の Sony Xperia P では、アプリケーションがこのメイン画面に来るたびに上記のコードが実行されます。firstRun を false にすると、なぜこのアクティビティに戻るたびに上記のコードが実行されるのでしょうか。デバイスでデバッグを試みたところ、次のエラーが発生しました。

10-22 17:41:49.879: E/WindowManager(30235): Activity org.mumbai77.core.Mumbai77Activity has    leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4143a460 that was originally added here 
10-22 17:41:49.879: E/WindowManager(30235): android.view.WindowLeaked: Activity org.mumbai77.core.Mumbai77Activity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@4143a460 that was originally added here 
10-22 17:41:49.879: E/WindowManager(30235):     at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
10-22 17:41:49.879: E/WindowManager(30235):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
10-22 17:41:49.879: E/WindowManager(30235):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
10-22 17:41:49.879: E/WindowManager(30235):     at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
10-22 17:41:49.879: E/WindowManager(30235):     at android.view.Window$LocalWindowManager.addView(Window.java:537)
10-22 17:41:49.879: E/WindowManager(30235):     at android.app.Dialog.show(Dialog.java:278)
10-22 17:41:49.879: E/WindowManager(30235):     at org.mumbai77.components.ProgressAsyncTask.onPreExecute(ProgressAsyncTask.java:56)
10-22 17:41:49.879: E/WindowManager(30235):     at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
10-22 17:41:49.879: E/WindowManager(30235):     at android.os.AsyncTask.execute(AsyncTask.java:511)
10-22 17:41:49.879: E/WindowManager(30235):     at org.mumbai77.core.Mumbai77Activity.onStart(Mumbai77Activity.java:170)
10-22 17:41:49.879: E/WindowManager(30235):     at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1133)
10-22 17:41:49.879: E/WindowManager(30235):     at android.app.Activity.performStart(Activity.java:4475)
 10-22 17:41:49.879: E/WindowManager(30235):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1940)
10-22 17:41:49.879: E/WindowManager(30235):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1992)
10-22 17:41:49.879: E/WindowManager(30235):     at android.app.ActivityThread.access$600(ActivityThread.java:127)
10-22 17:41:49.879: E/WindowManager(30235):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1158)
10-22 17:41:49.879: E/WindowManager(30235):     at android.os.Handler.dispatchMessage(Handler.java:99)
10-22 17:41:49.879: E/WindowManager(30235):     at android.os.Looper.loop(Looper.java:137)
10-22 17:41:49.879: E/WindowManager(30235):     at android.app.ActivityThread.main(ActivityThread.java:4441)
10-22 17:41:49.879: E/WindowManager(30235):     at java.lang.reflect.Method.invokeNative(Native Method)
10-22 17:41:49.879: E/WindowManager(30235):     at java.lang.reflect.Method.invoke(Method.java:511)
10-22 17:41:49.879: E/WindowManager(30235):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:823)
10-22 17:41:49.879: E/WindowManager(30235):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
10-22 17:41:49.879: E/WindowManager(30235):     at dalvik.system.NativeStart.main(Native Method)

SProgressAsyncTask クラスを変更し、Activity を渡す代わりに Context - getApplicationContext() を渡しましたが、さらに悪化しました。

onStart if (firstRun) が一度だけ実行されるのではなく、毎回実行される理由を誰でも知ることができますか。

ところで、私のデバイスと私の友人のデバイスはどちらもICECREAM Oのみを搭載しています。

この段階で5〜6日間立ち往生しています。どんな助けも非常に感謝しています。このエラーを取り除くのを手伝ってください。

4

3 に答える 3

0

firstRunオブジェクトをに設定するtrueと、onCreateそれ以外の場合は起動しないと思います。

これを行う場合は、アクティビティの有効期間を再度確認する必要があります。アクティビティはonCreate(firstRunをtrueに設定)で始まり、onStartが始まります。

この設定では、アプリは起動ASyncTaskごとにこれを起動します

于 2012-10-22T12:37:21.553 に答える
0

私が直面したこの例外は、あなたが同じ状況に陥っている可能性があります。AsyncTask はバックグラウンドで動作し、並列実行中の UI スレッドで例外が発生します。AsyncTask は、この例外を与えるダイアログを表示しようとしてまだ実行されています。正確な原因は、この例外スタック トレースの直前に logcat にも出力されます。logcat を確認してください。

于 2012-10-22T12:38:35.747 に答える
0

これがどのように機能したかは予想外でした。

変数を作成した静的クラスで試しました

public static boolean FIRST_START = true;

私のアクティビティクラスでは、firstRun 変数を CONSTANTS.FIRST_START に置き換え、onStart() の if 内に CONTACTS.FIRST_START = false を設定しました。そして今、それはメソッドを一度だけ呼び出します。つまり、実際にアプリを起動している間です。その後、アクティビティに戻ると、呼び出されません。

同じ方法で、異なるクラスの異なる var を使用しただけです。これはどのように奇妙ですか?もしあれば、これは誰かを助けるかもしれません。

于 2012-10-22T14:41:24.910 に答える