Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试设置纵向方向时,android.view.Window为tablet asynctask泄漏_Java_Android_Android Asynctask_Progressdialog - Fatal编程技术网

Java 尝试设置纵向方向时,android.view.Window为tablet asynctask泄漏

Java 尝试设置纵向方向时,android.view.Window为tablet asynctask泄漏,java,android,android-asynctask,progressdialog,Java,Android,Android Asynctask,Progressdialog,我有一个仅以纵向显示的活动,在我的平板电脑中,它会导致以下情况: android.view.WindowLeaked: Activity com.spicycurryman.getdisciplined10.app.InstalledAppActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{53210b88 V.E..... R.....ID 0,0-1520,192} that w

我有一个仅以纵向显示的活动,在我的平板电脑中,它会导致以下情况:

 android.view.WindowLeaked: Activity com.spicycurryman.getdisciplined10.app.InstalledAppActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView{53210b88 V.E..... R.....ID 0,0-1520,192} that was originally added here
            at android.view.ViewRootImpl.<init>(ViewRootImpl.java:354)
            at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:216)
            at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
            at android.app.Dialog.show(Dialog.java:281)
            at com.spicycurryman.getdisciplined10.app.InstalledAppActivity$LoadApplications.onPreExecute(InstalledAppActivity.java:306)
            at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586)
            at android.os.AsyncTask.execute(AsyncTask.java:534)
            at com.spicycurryman.getdisciplined10.app.InstalledAppActivity.onCreate(InstalledAppActivity.java:105)
            at android.app.Activity.performCreate(Activity.java:5104)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
取消进度对话框或调用finish也不能真正解决问题

我该如何解决这个问题

以下是AsyncTask的大部分代码:

    private class LoadApplications extends AsyncTask<Void, Void, Void> {


        private ProgressDialog pDialog;
        List<PackageInfo> packageList1 = new ArrayList<PackageInfo>();

        public LoadApplications(Context context){
            Context mContext = context;
        }

        @Override
        protected Void doInBackground(Void... params) {

            List<PackageInfo> packageList = packageManager
                    .getInstalledPackages(PackageManager.GET_PERMISSIONS);

            List<PackageInfo> packageList2 = packageManager
                    .getInstalledPackages(PackageManager.GET_PERMISSIONS);

            for(PackageInfo pi : packageList) {

                boolean b = isSystemPackage(pi);
                boolean c = isSystemPackage1(pi);
                boolean d = isSystemPackage2(pi);


                if ((!b || !c ) && d ){
                    packageList1.add(pi);
                }

            }

            //here you got email and message apps in the 

            for(PackageInfo pi : packageList) {

                boolean b = isSystemPackage3(pi);
                boolean c = isSystemPackage4(pi);


                if (b || c){
                    packageList1.add(pi);
                }

            }






            //sort by application name

            final PackageItemInfo.DisplayNameComparator comparator = new PackageItemInfo.DisplayNameComparator(packageManager);

            Collections.sort(packageList1, new Comparator<PackageInfo>() {
                @Override
                public int compare(PackageInfo lhs, PackageInfo rhs) {
                    return comparator.compare(lhs.applicationInfo, rhs.applicationInfo);
                }
            });

            return null;
        }
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        @Override
        protected void onPreExecute() {
            pDialog = new ProgressDialog(InstalledAppActivity.this);
            pDialog.setMessage("Loading your apps...");
            pDialog.show();

        }
        //Inefficient patch to prevent Window Manager error


        @Override
        protected void onPostExecute(Void result) {

            apkList.setAdapter(new ApkAdapter(InstalledAppActivity.this, packageList1, packageManager));

            try {
                if ((this.pDialog != null) && this.pDialog.isShowing()) {
                    this.pDialog.dismiss();
                }
            } catch (final IllegalArgumentException e) {
                // Handle or log or ignore
            } catch (final Exception e) {
                // Handle or log or ignore
            } finally {
                this.pDialog = null;
            }


            super.onPostExecute(result);
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }
}
试试这个:


在活动中声明非静态内部异步任务不是一个好主意,因为它包含对活动的引用,这可能是泄漏的原因。但是,各种配置更改可能会导致操作系统破坏并重新创建活动。有许多解决方案,Rustam的anser就是一个例子


然而,我更喜欢用户或者使用某种异步回调,比如广播。异步回调使您的AsyncTask与活动解耦。

我认为在方向更改时,您的活动正在重新启动,因此再次调用AsyncTast。我应该用什么来代替“ayncTask”?您的LoadApplication instancealso没有被重新设置InonConfigurationInstance弃用?以下是链接:备选方法,更好的方法是:
    private class LoadApplications extends AsyncTask<Void, Void, Void> {


        private ProgressDialog pDialog;
        List<PackageInfo> packageList1 = new ArrayList<PackageInfo>();

        public LoadApplications(Context context){
            Context mContext = context;
        }

        @Override
        protected Void doInBackground(Void... params) {

            List<PackageInfo> packageList = packageManager
                    .getInstalledPackages(PackageManager.GET_PERMISSIONS);

            List<PackageInfo> packageList2 = packageManager
                    .getInstalledPackages(PackageManager.GET_PERMISSIONS);

            for(PackageInfo pi : packageList) {

                boolean b = isSystemPackage(pi);
                boolean c = isSystemPackage1(pi);
                boolean d = isSystemPackage2(pi);


                if ((!b || !c ) && d ){
                    packageList1.add(pi);
                }

            }

            //here you got email and message apps in the 

            for(PackageInfo pi : packageList) {

                boolean b = isSystemPackage3(pi);
                boolean c = isSystemPackage4(pi);


                if (b || c){
                    packageList1.add(pi);
                }

            }






            //sort by application name

            final PackageItemInfo.DisplayNameComparator comparator = new PackageItemInfo.DisplayNameComparator(packageManager);

            Collections.sort(packageList1, new Comparator<PackageInfo>() {
                @Override
                public int compare(PackageInfo lhs, PackageInfo rhs) {
                    return comparator.compare(lhs.applicationInfo, rhs.applicationInfo);
                }
            });

            return null;
        }
        @Override
        protected void onCancelled() {
            super.onCancelled();
        }

        @Override
        protected void onPreExecute() {
            pDialog = new ProgressDialog(InstalledAppActivity.this);
            pDialog.setMessage("Loading your apps...");
            pDialog.show();

        }
        //Inefficient patch to prevent Window Manager error


        @Override
        protected void onPostExecute(Void result) {

            apkList.setAdapter(new ApkAdapter(InstalledAppActivity.this, packageList1, packageManager));

            try {
                if ((this.pDialog != null) && this.pDialog.isShowing()) {
                    this.pDialog.dismiss();
                }
            } catch (final IllegalArgumentException e) {
                // Handle or log or ignore
            } catch (final Exception e) {
                // Handle or log or ignore
            } finally {
                this.pDialog = null;
            }


            super.onPostExecute(result);
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }
    }
}
@Override
    public Object onRetainNonConfigurationInstance() {
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog = null;
        }
        if (asynTask!= null) {
            asynTask.detach();
        }
        return ayncTask;
    }