0

Webサービスに接続されたアプリケーションがあります。アプリケーションを起動したら、クラスを呼び出します。

public class CaApplication extends Application {

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        DataRetrieve dr ;
        ProgressDialog progressBar;

            progressBar = new ProgressDialog(this);

            //progress bar orientation
            progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

            // Text that will appear on the progress bar dialog
            progressBar.setMessage("Loading...");

        //set whether the progress bar is cancelable or not
            progressBar.setCancelable(false);
            progressBar.show();
         dr = new DataRetrieve();
    }
}

エラーが発生します:

11-25 15:39:36.698: E/AndroidRuntime(30429): Caused by: 11-25 15:39:36.698: E/AndroidRuntime(30429): java.lang.RuntimeException: Unable to create application com.example.storeclientdropdown.CambiumApplication: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3974)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.app.ActivityThread.access$1300(ActivityThread.java:127)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.os.Handler.dispatchMessage(Handler.java:99)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.os.Looper.loop(Looper.java:137)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.app.ActivityThread.main(ActivityThread.java:4441)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at java.lang.reflect.Method.invokeNative(Native Method)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at java.lang.reflect.Method.invoke(Method.java:511)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at dalvik.system.NativeStart.main(Native Method)
11-25 15:39:36.698: E/AndroidRuntime(30429): Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:517)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.app.Dialog.show(Dialog.java:278)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at com.example.storeclientdropdown.CambiumApplication.onCreate(CambiumApplication.java:35)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
11-25 15:39:36.698: E/AndroidRuntime(30429):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3971)
11-25 15:39:36.698: E/AndroidRuntime(30429):    ... 10 more

DataRetrib では、Web サービスからすべてのデータを取得し、その後 MainActivity を呼び出します。何が問題で、どうすればこのバグを修正できますか。私は試してみます: progressBar = new ProgressDialog(this);progressBar = new ProgressDialog(getApplicationContext());progressBar = new ProgressDialog(getBaseContext);しかし結果はありません。

4

2 に答える 2

4

ApplicationではありませんContext。ダイアログのベースとして使用することはできません。

MainActivity(実行される最初のアクティビティを意味する)で行う必要があるのは、アプリケーションレベルでこれを行う代わりに、ProgressBarを開始することです。

開発者サイトの優れたドキュメントのいくつかを読んでみてください

編集:

私の理解では、実際のアプリが起動する前に機能するスプラッシュ画面を作成しようとしています。

これは非常に簡単なことであり、次のように実行する必要があります。

public class SplashScreen extends Activity {
    @Override
    public void onCreate() {
        super.onCreate();
        DataRetrieve dr ;
        ProgressDialog progressBar;

        progressBar = new ProgressDialog(this);

        //progress bar orientation
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);

        // Text that will appear on the progress bar dialog
        progressBar.setMessage("Loading...");

       //set whether the progress bar is cancelable or not
        progressBar.setCancelable(false);
        progressBar.show();
        dr = new DataRetrieve(); // THIS SHOULD BE DONE IN AN AsyncTask
        // WHEN DATA IS DONE RETRIEVING
        progressBar.dismiss();
        Intent startApp = new Intent(SplashScreen.this, MainActivity.class);
        startActivity(startApp);
        finish();
    }
}
于 2012-11-25T14:53:17.677 に答える
0

@thepoosh が言及したように、アプリケーションはコンテキストではありません。また、アプリケーションの起動時にこれを 1 回だけ実行する場合は、このコードをデフォルト アクティビティの 1 つの関数 (最初に表示されるアクティビティ) に配置し、この関数を で呼び出しますonCreate()。また、実行しているブロック タスクの場合は、別の に入れ、Thread計算またはダウンロードが完了したら ProgressDialog を閉じます。

これをアプリケーションの初回起動時にのみ実行し、最初のアクティビティを開くたびに実行したくない場合 (ユーザーが前後にトラバースするため)、ダウンロードが完了すると設定され、更新されない静的フラグを維持します。別のダウンロードが必要になるまで。

于 2012-11-25T15:07:42.670 に答える