0

AsyncTask を使用して進行状況ダイアログを作成し、新しいアクティビティを開始しています。コードは次のとおりです:-

package com.android.grad;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.provider.MediaStore;

public class LoginTask extends AsyncTask<Void, Void, Boolean> {

    private Activity activity;
    private ProgressDialog pd;
    private Uri fileUri;
    private final int CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE = 100;

    public LoginTask(Activity activity, Uri fileUri) {
        this.activity = activity;
        this.fileUri = fileUri;
    }

    @Override
    protected void onPreExecute() {
        //fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        pd = ProgressDialog.show(activity, "Signing in",
                "Please wait while we are signing you in..");
    }

    @Override
    protected Boolean doInBackground(Void... arg0) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        pd.dismiss();
        pd = null;
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        activity.startActivityForResult(intent,
                CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }   
}

このアクションリスナーを使用してボタンを押すと、このタスクが開始されます。

private OnClickListener loginOnClick = new OnClickListener() {
        public void onClick(View v) {
            new LoginTask(LoginActivity.this, fileUri).execute();
        }
    };

向きが変わったときにそのエラーが発生しました。

06-25 20:41:27.199: E/WindowManager(8867): Activity com.android.grad.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@2be69ff8 that was originally added here
06-25 20:41:27.199: E/WindowManager(8867): android.view.WindowLeaked: Activity com.android.grad.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@2be69ff8 that was originally added here
06-25 20:41:27.199: E/WindowManager(8867):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:344)
06-25 20:41:27.199: E/WindowManager(8867):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:267)
06-25 20:41:27.199: E/WindowManager(8867):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
06-25 20:41:27.199: E/WindowManager(8867):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
06-25 20:41:27.199: E/WindowManager(8867):  at android.view.Window$LocalWindowManager.addView(Window.java:537)
06-25 20:41:27.199: E/WindowManager(8867):  at android.app.Dialog.show(Dialog.java:278)
06-25 20:41:27.199: E/WindowManager(8867):  at android.app.ProgressDialog.show(ProgressDialog.java:116)
06-25 20:41:27.199: E/WindowManager(8867):  at android.app.ProgressDialog.show(ProgressDialog.java:99)
06-25 20:41:27.199: E/WindowManager(8867):  at android.app.ProgressDialog.show(ProgressDialog.java:94)
06-25 20:41:27.199: E/WindowManager(8867):  at com.android.grad.LoginTask.onPreExecute(LoginTask.java:25)
06-25 20:41:27.199: E/WindowManager(8867):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
06-25 20:41:27.199: E/WindowManager(8867):  at android.os.AsyncTask.execute(AsyncTask.java:511)
06-25 20:41:27.199: E/WindowManager(8867):  at com.android.grad.LoginActivity$1.onClick(LoginActivity.java:36)
06-25 20:41:27.199: E/WindowManager(8867):  at android.view.View.performClick(View.java:3527)
06-25 20:41:27.199: E/WindowManager(8867):  at android.view.View$PerformClick.run(View.java:14234)
06-25 20:41:27.199: E/WindowManager(8867):  at android.os.Handler.handleCallback(Handler.java:605)
06-25 20:41:27.199: E/WindowManager(8867):  at android.os.Handler.dispatchMessage(Handler.java:92)
06-25 20:41:27.199: E/WindowManager(8867):  at android.os.Looper.loop(Looper.java:137)
06-25 20:41:27.199: E/WindowManager(8867):  at android.app.ActivityThread.main(ActivityThread.java:4441)
06-25 20:41:27.199: E/WindowManager(8867):  at java.lang.reflect.Method.invokeNative(Native Method)
06-25 20:41:27.199: E/WindowManager(8867):  at java.lang.reflect.Method.invoke(Method.java:511)
06-25 20:41:27.199: E/WindowManager(8867):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-25 20:41:27.199: E/WindowManager(8867):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-25 20:41:27.199: E/WindowManager(8867):  at dalvik.system.NativeStart.main(Native Method)
06-25 20:41:27.309: D/dalvikvm(8867): GC_CONCURRENT freed 265K, 4% free 9339K/9671K, paused 6ms+4ms
06-25 20:41:27.519: D/AndroidRuntime(8867): Shutting down VM
06-25 20:41:27.519: W/dalvikvm(8867): threadid=1: thread exiting with uncaught exception (group=0x2b542210)
06-25 20:41:27.529: E/AndroidRuntime(8867): FATAL EXCEPTION: main
06-25 20:41:27.529: E/AndroidRuntime(8867): java.lang.IllegalArgumentException: View not attached to window manager
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:587)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:324)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.view.WindowManagerImpl$CompatModeWrapper.removeView(WindowManagerImpl.java:151)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.app.Dialog.dismissDialog(Dialog.java:321)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.app.Dialog$1.run(Dialog.java:119)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.os.Handler.handleCallback(Handler.java:605)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.os.Looper.loop(Looper.java:137)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at android.app.ActivityThread.main(ActivityThread.java:4441)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at java.lang.reflect.Method.invokeNative(Native Method)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at java.lang.reflect.Method.invoke(Method.java:511)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-25 20:41:27.529: E/AndroidRuntime(8867):     at dalvik.system.NativeStart.main(Native Method)

サイトを検索しましたが、自分に合った解決策が見つかりませんでした

@Override
    protected void onPreExecute() {
        //fileUri = getOutputMediaFileUri(MEDIA_TYPE_IMAGE);
        pd = ProgressDialog.show(activity.getApplicationContext(), "Signing in",
                "Please wait while we are signing you in..");
    }

    @Override
    protected Boolean doInBackground(Void... arg0) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
        }
        return true;
    }

    @Override
    protected void onPostExecute(Boolean result) {
        pd.dismiss();
        pd = null;
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, fileUri);
        activity.startActivityForResult(intent,
                CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE);
    }   

06-25 21:23:59.709: E/AndroidRuntime(10041): FATAL EXCEPTION: main
06-25 21:23:59.709: E/AndroidRuntime(10041): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:517)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:301)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:215)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:140)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.app.Dialog.show(Dialog.java:278)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.app.ProgressDialog.show(ProgressDialog.java:116)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.app.ProgressDialog.show(ProgressDialog.java:99)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.app.ProgressDialog.show(ProgressDialog.java:94)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at com.android.grad.LoginTask.onPreExecute(LoginTask.java:25)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:561)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.os.AsyncTask.execute(AsyncTask.java:511)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at com.android.grad.LoginActivity$1.onClick(LoginActivity.java:38)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.view.View.performClick(View.java:3527)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.view.View$PerformClick.run(View.java:14234)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.os.Handler.handleCallback(Handler.java:605)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.os.Handler.dispatchMessage(Handler.java:92)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.os.Looper.loop(Looper.java:137)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at android.app.ActivityThread.main(ActivityThread.java:4441)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at java.lang.reflect.Method.invokeNative(Native Method)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at java.lang.reflect.Method.invoke(Method.java:511)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
06-25 21:23:59.709: E/AndroidRuntime(10041):    at dalvik.system.NativeStart.main(Native Method)
4

3 に答える 3

1

AsyncTaskが本当に概念的に欠陥があるのか​​、それとも何かが足りないのかを確認してください。

これは、この問題の詳細な調査と、デバイス構成の変更(方向の変更など)によって引き起こされたアクティビティのリスター間で非同期タスクを実行し続ける方法に関する優れたソリューションを提供します。

于 2012-06-25T19:01:30.757 に答える
1

回転すると、Activity が破棄され、ProgressDialog も破棄されるため、ダイアログを非表示にしようとすると、ダイアログが存在しなくなり、この例外が生成されます。

于 2012-06-25T18:47:11.330 に答える
1
 com.android.grad.LoginActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@2be69ff8 that was originally added here

1-見た目のように、Activity参照を使用してダイアログのみを表示しているため、Activity ctoコンストラクターpass Application contextをそれに渡してダイアログを表示するのではなく....

2-pd.dismiss(); pd = null; doInBackground の onPostExecute にある必要があります。

 If(null!=pd && pd.isShowing ()){
      pd.dismiss();

       pd = null;
    }
于 2012-06-25T18:49:07.303 に答える