java.lang.IllegalArgumentException: উইন্ডো ম্যানেজারের সাথে সংযুক্ত নয় দেখুন


148

আমার একটি ক্রিয়াকলাপ রয়েছে যা অ্যাসিঙ্কটাস্ক শুরু করে এবং অপারেশনের সময়কালের জন্য অগ্রগতি ডায়ালগ দেখায়। ক্রিয়াকলাপটি ঘোরানো বা কীবোর্ড স্লাইড দ্বারা পুনরায় তৈরি করা হবে না বলে ঘোষণা করা হয়।

    <activity android:name=".MyActivity" 
              android:label="@string/app_name"
              android:configChanges="keyboardHidden|orientation"
              >
        <intent-filter>
        </intent-filter>
    </activity>

টাস্ক শেষ হয়ে গেলে, আমি ডায়লগটি ছড়িয়ে দেব, তবে কিছু ফোনে (ফ্রেমওয়ার্ক: 1.5, 1.6) এ জাতীয় ত্রুটি নিক্ষেপ করা হয়:

java.lang.IllegalArgumentException: View not attached to window manager
    at android.view.WindowManagerImpl.findViewLocked(WindowManagerImpl.java:356)
    at android.view.WindowManagerImpl.removeView(WindowManagerImpl.java:201)
    at android.view.Window$LocalWindowManager.removeView(Window.java:400)
    at android.app.Dialog.dismissDialog(Dialog.java:268)
    at android.app.Dialog.access$000(Dialog.java:69)
    at android.app.Dialog$1.run(Dialog.java:103)
    at android.app.Dialog.dismiss(Dialog.java:252)
    at xxx.onPostExecute(xxx$1.java:xxx)

আমার কোডটি হ'ল:

final Dialog dialog = new AlertDialog.Builder(context)
    .setTitle("Processing...")
    .setCancelable(true)
    .create();

final AsyncTask<MyParams, Object, MyResult> task = new AsyncTask<MyParams, Object, MyResult>() {

    @Override
    protected MyResult doInBackground(MyParams... params) {
        // Long operation goes here
    }

    @Override
    protected void onPostExecute(MyResult result) {
        dialog.dismiss();
        onCompletion(result);
    }
};

task.execute(...);

dialog.setOnCancelListener(new OnCancelListener() {
    @Override
    public void onCancel(DialogInterface arg0) {
        task.cancel(false);
    }
});

dialog.show();

আমি যা পড়েছি ( http://bend-ing.blogspot.com/2008/11/properly-handle-progress-dialog-in.html ) এবং অ্যান্ড্রয়েড উত্সগুলিতে দেখেছি তা এটিকে পাওয়ার একমাত্র সম্ভাব্য পরিস্থিতি বলে মনে হচ্ছে ব্যতিক্রম হ'ল যখন কার্যকলাপটি ধ্বংস হয়ে যায় was তবে আমি যেমনটি উল্লেখ করেছি, আমি মৌলিক ইভেন্টগুলির জন্য ক্রিয়াকলাপ বিনোদনকে নিষেধ করি।

সুতরাং কোন পরামর্শ খুব প্রশংসা করা হয়।


1
এই প্রশ্নের অনেক উত্তর পেয়েছে, যদি তাদের কেউ যদি আপনাকে সহায়তা করে তবে দয়া করে এটি সঠিক উত্তর হিসাবে নির্বাচন করুন।
পরাগ কদম

উত্তর:


228

আমিও কখনও কখনও এই ত্রুটিটি পাই যখন আমি ডায়লগটি খারিজ করি এবং অনপস্টএক্সেকিউট পদ্ধতি থেকে ক্রিয়াকলাপ শেষ করি। আমার ধারণা কখনও কখনও ডায়ালগ সফলভাবে খারিজ হওয়ার আগে কার্যকলাপ শেষ হয়ে যায়।

সহজ, তবে কার্যকর সমাধান যা আমার পক্ষে কাজ করে

@Override
protected void onPostExecute(MyResult result) {
    try {
        if ((this.mDialog != null) && this.mDialog.isShowing()) {
            this.mDialog.dismiss();
        }
    } catch (final IllegalArgumentException e) {
        // Handle or log or ignore
    } catch (final Exception e) {
        // Handle or log or ignore
    } finally {
        this.mDialog = null;
    }  
}

44
সহজ সমাধান? হ্যাঁ. কার্যকর? সম্ভবত এই ক্ষেত্রে। আমি কি এটি সুপারিশ করব? না! এর মতো সমস্ত ব্যতিক্রম গ্রাস করবেন না ! আমি এমনকি অবৈধআর্গুমেন্টএক্সেপশন ধরতে পারি না, তবে অন্য একটি সমাধান খুঁজছি।
সাইমন ফোরসবার্গ

6
কারণ সাধারণত খালি চেষ্টা করা ক্যাচগুলি একটি খারাপ ধারণা ... যদিও এটি কখনও কখনও করা সঠিক জিনিস হতে পারে।
থমাস

3
@ দামজান আপনার প্রতিক্রিয়া অনুসারে আপনি ব্যতিক্রম ধরা ধরার পরামর্শ দিচ্ছেন। ঠিক আছে, গুগলের এটি একটি খারাপ অভ্যাস। আপনি এটি সম্পর্কে এখানে পড়তে পারেন: জেনেরিক ব্যতিক্রমটি ধরবেন না
ইয়ানিভ

17
আমি বিশ্বাস করি এটি একটি কার্যকর সমাধান। সাধারণ ক্ষেত্রে, আমাদের এটি করা উচিত নয়, তবে অ্যান্ড্রয়েড ফ্রেমওয়ার্ক আমাদের জন্য কোনও সহজ চেক সরবরাহ করে না, তাই আমাদের অস্বাভাবিক উপায় ব্যবহার করতে হবে use এছাড়াও, যদি কোনও ডায়ালগের ইজ শোইং () কলটি আমাদের প্রত্যাশা অনুযায়ী কাজ করে তবে আমাদের এই ধরণের হ্যাকের প্রয়োজন নেই।
এসএক্সসি

1
আরও ভাল কিছু না পাওয়া পর্যন্ত দ্রুত ফিক্স করুন
রোহিত তিগগা

13

এখানে আমার "বুলেট প্রুফ" সমাধানটি রয়েছে, যা এই বিষয়ে আমি যে সমস্ত ভাল উত্তর পেয়েছি তার সংকলন (@ দামজান এবং @ কচিকে ধন্যবাদ)। এখানে ব্যতিক্রমটি কেবল তখনই গ্রাস করা হবে যদি সনাক্তকরণের সমস্ত অন্যান্য উপায় সফল না হয়। আমার ক্ষেত্রে আমার ডায়ালগটি স্বয়ংক্রিয়ভাবে বন্ধ করা দরকার এবং অ্যাপটি ক্রাশ থেকে রক্ষা করার একমাত্র উপায়। আমি আশা করি এটা তোমাকে সাহায্য করবে! দয়া করে ভোট দিন এবং আপনার মন্তব্য বা আরও ভাল সমাধান থাকলে মন্তব্যগুলি দিন leave ধন্যবাদ!

public void dismissWithCheck(Dialog dialog) {
        if (dialog != null) {
            if (dialog.isShowing()) {

                //get the Context object that was used to great the dialog
                Context context = ((ContextWrapper) dialog.getContext()).getBaseContext();

                // if the Context used here was an activity AND it hasn't been finished or destroyed
                // then dismiss it
                if (context instanceof Activity) {

                    // Api >=17
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                        if (!((Activity) context).isFinishing() && !((Activity) context).isDestroyed()) {
                            dismissWithTryCatch(dialog);
                        }
                    } else {

                        // Api < 17. Unfortunately cannot check for isDestroyed()
                        if (!((Activity) context).isFinishing()) {
                            dismissWithTryCatch(dialog);
                        }
                    }
                } else
                    // if the Context used wasn't an Activity, then dismiss it too
                    dismissWithTryCatch(dialog);
            }
            dialog = null;
        }
    }

    public void dismissWithTryCatch(Dialog dialog) {
        try {
            dialog.dismiss();
        } catch (final IllegalArgumentException e) {
            // Do nothing.
        } catch (final Exception e) {
            // Do nothing.
        } finally {
            dialog = null;
        }
    }

1
খুব ভাল সমাধান! সেটিংয়ের dialog = nullকোনও প্রভাব নেই। এবং StatusEventDialogঠিক পড়া উচিত Dialog
hgoebl

1
স্ট্যাটাসএভেন্টডায়ালগটি ডায়ালগে পরিবর্তন করা উচিত।
শ্রীকান্ত করুণাঘাট

এই উত্তরটি স্বীকৃত এক হওয়া উচিত, খুব ভালভাবে পরিচালনা করা
ব্লুওয়্যার

আমি বুঝতে পেরেছি আপনি "সঠিক" হতে চান এবং কেবল চেষ্টা / ক্যাচ ব্যবহারের ক্ষেত্রে isDestroyed()পাওয়া যায় না, তবে ব্যবহারিক উদ্দেশ্যে কি সর্বদা চেষ্টা / ধরা ব্যবহার করা একই হবে না?
zundi

11

আমার একটি কাজ হতে পারে।

একই সমস্যা ছিল, যেখানে আমি প্রচুর আইটেমগুলি (ফাইল সিস্টেমের ListViewমাধ্যমে ) একটি এর মাধ্যমে লোড করছিAsyncTaskonPreExecute()একটি গুলি চালানো ছিল ProgressDialogএবং তারপরে উভয় onPostExecute()এবং onCancelled()(যখন টাস্কটি স্পষ্টভাবে বাতিল করার মাধ্যমে বলা হবে AsyncTask.cancel()) এটি বন্ধ করে দিয়েছিল .cancel()

একই "java.lang.IllegalArgumentException পেয়েছি: উইন্ডো ম্যানেজারের সাথে সংযুক্ত না হওয়া দেখুন" ত্রুটিটি যখন আমি onCancelled()পদ্ধতিতে ডায়ালগটি হত্যা করছিলাম তখন AsyncTask(আমি এটি দুর্দান্ত শেল্ভস অ্যাপ্লিকেশনটিতে দেখেছি )।

কর্মক্ষেত্রটি ছিল একটি সর্বজনীন ক্ষেত্র তৈরি করতে AsyncTask যা এতে রয়েছে ProgressDialog:

public ProgressDialog mDialog;

তারপরে, onDestroy()আমি যখন আমার বাতিল করি তখন আমি এর AsyncTaskমাধ্যমে সম্পর্কিত ডায়ালগটিও মেরে ফেলতে পারি:

AsyncTask.mDialog.cancel();

AsyncTask.cancel()ডয়েসকে কল করা কলকে ট্রিগার onCancelled()করছে AsyncTask, তবে কোনও কারণে সেই পদ্ধতিটি কল করার সময়, ভিউ ইতিমধ্যে ধ্বংস হয়ে গেছে এবং এভাবে ডায়লগ বাতিল করা ব্যর্থ হচ্ছে।


@ পল উল্লিখিত হিসাবে আমি ইউজারটাস্ক বাস্তবায়নটিকে দুর্দান্ত দেখি। উত্স কোডটি এখানে রয়েছে: code.google.com/p/shelves/source/browse/trunk/Sllves/src/org/…
এভি গান

একই প্রকল্পে ব্যবহারের সন্ধান পাওয়া যায়: কোড. google.com/p/shelves/source/browse/trunk/Shelves/src/org/…
এভি গান

9

এই সমস্যাটি সমাধানের সঠিক সমাধানটি এখানে:

public void hideProgress() {
    if(mProgressDialog != null) {
        if(mProgressDialog.isShowing()) { //check if dialog is showing.

            //get the Context object that was used to great the dialog
            Context context = ((ContextWrapper)mProgressDialog.getContext()).getBaseContext();

            //if the Context used here was an activity AND it hasn't been finished or destroyed
            //then dismiss it
            if(context instanceof Activity) { 
                if(!((Activity)context).isFinishing() && !((Activity)context).isDestroyed()) 
                    mProgressDialog.dismiss();
            } else //if the Context used wasnt an Activity, then dismiss it too
                mProgressDialog.dismiss();
        }
        mProgressDialog = null;
    }
}

অন্ধভাবে সমস্ত ব্যতিক্রম ধরা না দিয়ে, এই সমাধানটি সমস্যার মূলটিকে সম্বোধন করে: ডায়ালগটিকে কমিয়ে দেওয়ার চেষ্টা করার সময় ডায়ালগটি আরম্ভ করার জন্য ব্যবহৃত ক্রিয়াকলাপটি ইতিমধ্যে শেষ হয়ে গেলে। আমার নেক্সাস 4 চলমান কিটক্যাট নিয়ে কাজ করছে তবে অ্যান্ড্রয়েডের সমস্ত সংস্করণে কাজ করা উচিত।


3
isDestroyedএপিআই 17+ প্রয়োজন
Androiderson

আপনাকে কেন বাতিল করতে এমপ্রেগ্রেসডায়ালগ সেট করতে হবে? এটি কি স্মৃতি ফাঁসের সাথে সম্পর্কিত? আপনি দয়া করে ব্যাখ্যা করতে পারেন?
পবন

@ পাওয়ান, এটি আমার শেষের একটি বাস্তবায়ন বিশদ। এটি প্রয়োজন হয় না, এই শ্রেণীর ফাংশনটি ঠিক এইভাবে কাজ করে। একটি অগ্রগতি ডায়ালগ গোপন করার পরে, আমি এটিকে বাতিল করে দিন। যখন কোনও ব্যবহারকারী অন্য অগ্রগতি ডায়ালগটি দেখাতে চায়, তখন একটি নতুন উদাহরণ ইনস্ট্যান্ট হয়।
কাচি

অবশ্যই! ((ক্রিয়াকলাপ) প্রসঙ্গ) .আইফিনিশিং () প্রয়োজনীয়, ধন্যবাদ! :)
ড্যানিয়েল ক্রজিস্কোভস্কি

5

আমি 'দামজান' এর একটি মতামতকে সম্মত করি।
আপনি যদি অনেকগুলি ডায়ালগ ব্যবহার করেন তবে অন ডেট্রয়ে () বা অনস্টপ () এ সমস্ত ডায়ালগটি বন্ধ করে দেওয়া উচিত।
তারপরে আপনি 'java.lang.IllegalArgumentException: উইন্ডো ম্যানেজারের সাথে সংযুক্ত নেই দেখুন' এর ফ্রিকোয়েন্সি হ্রাস করতে সক্ষম হতে পারেন exception

@Override
protected void onDestroy() {
    Log.d(TAG, "called onDestroy");
    mDialog.dismiss();
    super.onDestroy();
}



তবে কিছুটা অতিক্রম করে ...
আরও স্পষ্ট করে তুলতে, আপনি অনদাস্ট্রয় ডেকে যাওয়ার পরে কোনও ডায়ালগ দেখাতে বাধা দিন।
আমি নীচের মত ব্যবহার করি না তবে এটা পরিষ্কার

private boolean mIsDestroyed = false;

private void showDialog() {
    closeDialog();

    if (mIsDestroyed) {
        Log.d(TAG, "called onDestroy() already.");
        return;
    }

    mDialog = new AlertDialog(this)
        .setTitle("title")
        .setMessage("This is DialogTest")
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                dialog.dismiss();
            }
        })
        .create();
    mDialog.show();
}

private void closeDialog() {
    if (mDialog != null) {
        mDialog.dismiss();
    }
}

@Override
protected void onDestroy() {
    Log.d(TAG, "called onDestroy");
    mIsDestroyed = true;
    closeDialog();
    super.onDestroy();
}


শুভকামনা!


আমি সবসময় খালি ক্যাচ ব্লকগুলি এড়ানো পছন্দ করি। চেষ্টা করার মতো, তবে যেহেতু এই ত্রুটিটি উত্পাদন করা শক্ত - তাই এটি আসলে কাজ করছে কিনা তা কেবল সময়ই বলে দেবে। যাই হোক ধন্যবাদ.
আতঙ্কিত ফিচম্যান

খালি ধরা ব্লক কি? আমি চেষ্টা / ধরা ব্যবহার করি না। একটি এমআইএসট্রয়েড ভেরিয়েবল কাজ করা ছাড়িয়ে গেছে। তবে আপনি যদি অন্য থ্রেডে কিছু কাজ করার পরে সেই ডায়ালগ শোতে কোড লিখেন তবে আপনার এই পরিবর্তনশীলটির প্রয়োজন হতে পারে। যখন অন্য থ্রেড কাজ করছে, যদি কার্যকলাপ শেষ হয়, আপনি এই ব্যতিক্রমটি দেখতে পারেন।
হোগুন

আমারও একই সমস্যা ছিল এবং যখন আমি @ ওভাররাইড পাবলিক শূন্যপদটি on (পজ) () added যদি (কথোপকথন! = নাল) কথোপকথন যুক্ত করি। super.onPause (); present আজ অবধি আমার এই ত্রুটি আছে না ... তাই আমি মনে করি এটি আপনার উত্তরটির মতো এবং এটি সত্যিই দরকারী
ক্রিস সিম

@ ক্রিসিসিম হ্যালো! onPuase () এবং onDestroy () হ'ল ডেফেরেন্স। যখন ক্রিয়াকলাপটি চালু হয়, ডায়ালগটি বন্ধ থাকে। এবং আপনি যখন অ্যাপ্লিকেশনটি কার্যকর করেন তখন ডায়ালগটি প্রদর্শিত হয় না। তুমি কি এটা চাও?
হোগুন

@ হোগুন হ্যাঁ অবশ্যই, আমি একই ধারণাটির অর্থ, আমি বিনাশের পরিবর্তে বিরতিতে ডায়লগটি বন্ধ করছি কারণ আমার এটি বিনষ্ট না হয়ে বিরতিতে প্রয়োজন। দ্বিতীয়ত, আমি এটি বন্ধ করে দিই যখন এটি শূন্য হয় না। অন্যদের জন্য এটি ব্যাখ্যা করার জন্য আপনাকে ধন্যবাদ।
ক্রিস সিম

4

এটা ব্যবহার কর.

if(_dialog!=null && _dialog.isShowing())
_dialog.dismiss();

2
এটি প্রায় একই সমাধান যা ড্যামজান প্রস্তাব করেছিল।
ইয়ুরি

28
এটি পর্যাপ্ত নয়, এই চেকটি দিয়ে এখনও অবৈধআরগসিপশন ঘটে।
মার্ফি

আমি একই সমাধান করেছি, তবে এটি কার্যকর কিনা তা এখনও জানি না। কেবলমাত্র পার্থক্য, আমি দু'টি নেস্ট করেছি যদি নিশ্চিত হয়ে থাকে যে দ্বিতীয় অংশটি .শোভিং () শূন্য হলে মূল্যায়ন করা হবে না।
নিক

2
এটি যথেষ্ট নয়।
ট্র্যান্ট করুন

1
@ নিক: এই জাতীয় ifক্ষেত্রে একাধিক বাসা বাঁধার দরকার নেই , জাভার &&অপারেটরটির অলস মূল্যায়ন (এটি সংক্ষিপ্ত সার্কিটও বলা হয়), যার অর্থ ২ য় অপারেন্ড মূল্যায়ন করা হয় না যদি প্রথমটির সাথে মূল্যায়ন হয় false(যার অর্থ ফলাফলের ফলাফল) &&সবসময় হতে হবে falseযাহাই হউক না কেন, অত "অলস" মূল্যায়ন)। ||প্রথমটি যদি মূল্যায়ন করে তবে একইভাবে এর ২ য় অপারেন্ডকে মূল্যায়ন করবে না true। দ্রষ্টব্য: &এবং |অপারেটরদের এই আচরণ নেই এবং এভাবে সর্বদা উভয় অপারেশনকে মূল্যায়ন করে।
ম্যাথিয়াস

3

আমারও একই সমস্যা ছিল, আপনি এটির মাধ্যমে সমাধান করতে পারেন:

@Override
protected void onPostExecute(MyResult result) {
    try {
        if ((this.mDialog != null) && this.mDialog.isShowing()) {
            this.mDialog.dismiss();
        }
    } catch (final IllegalArgumentException e) {
        // Handle or log or ignore
    } catch (final Exception e) {
        // Handle or log or ignore
    } finally {
        this.mDialog = null;
    }  
}

2

আমি মনে করি যে অন্য কোড প্রস্তাবিত উত্তরগুলির বিপরীতে আপনার কোডটি সঠিক। onPostExecute ইউআই থ্রেডে চলবে। এটি AsyncTask এর সম্পূর্ণ পয়েন্ট - আপনার রানঅনউইথ্রেড কল করতে বা হ্যান্ডলারদের সাথে ডিল করার বিষয়ে চিন্তা করতে হবে না। তদুপরি, দস্তাবেজ অনুসারে, বরখাস্ত () কে কোনও থ্রেড থেকে নিরাপদে কল করা যেতে পারে (নিশ্চিত নয় যে তারা এটিকে ব্যতিক্রম করেছেন)।

সম্ভবত এটি একটি সময়সীমার বিষয় যেখানে ক্রিয়াকলাপটি আর প্রদর্শিত না হওয়ার পরে ডায়লগ.ডিজমিস () কল করা হচ্ছে?

আপনি যদি সেটঅনস্যান্সেললিস্টনার মন্তব্য করেন এবং ব্যাকগ্রাউন্ড টাস্ক চলাকালীন ক্রিয়াকলাপটি থেকে প্রস্থান করেন তবে কী হবে তা পরীক্ষার বিষয়ে কী বলা যায়? তারপরে আপনার onPostExecute ইতিমধ্যে বরখাস্ত ডায়ালগটি খারিজ করার চেষ্টা করবে। যদি অ্যাপটি ক্র্যাশ হয়ে থাকে তবে আপনি সম্ভবত খালি ডায়ালগটি খারিজ করার আগে খোলার চেষ্টা করতে পারেন।

আমার ঠিক একই সমস্যা হচ্ছে তাই আমি কোড এ চেষ্টা করে যাচ্ছি।


আমি হ্রাসযুক্ত () কোডটিও দেখেছিলাম এবং এটি কোনও থ্রেড থেকে নিরাপদে কল করা যেতে পারে। বিটিডাব্লু, পরীক্ষার ক্ষেত্রে আমার সমস্যা আছে, কারণ ব্যবহারকারীদের ফোনে এই সমস্যাটি দেখা দেয় এবং আমি নিজেই নিজেই পুনরুত্পাদন করতে সক্ষম হইনি :-( সুতরাং কোড বিশ্লেষণ করে বের করার চেষ্টা করছিলাম ... সময় অনুসারে আমি এই বিষয়ে ভাবছিলাম, তবে ডায়ালগের আগে ক্রিয়াকলাপ কীভাবে বন্ধ করা যায় এমন পরিস্থিতিটি কল্পনা করতে পারে না B ব্যাক টিপলে প্রথমে ডায়ালগটি বাতিল হয়ে যায় And এবং ক্রিয়াকলাপটি স্বয়ংক্রিয়ভাবে বিনোদন ম্যানিফেস্ট ফাইল দ্বারা নিষিদ্ধ করা হয়েছে তবে কীভাবে এটি এখনও কিছুটা পুনরায় তৈরি করা যেতে পারে? আপনি যদি কিছু খুঁজে পান তবে আমাকে
জানুন

2

অ্যালেক্স,

আমি এখানে ভুল হতে পারি, তবে আমার সন্দেহ হয় যে 'বন্যের মধ্যে' একাধিক ফোনগুলিতে একটি বাগ রয়েছে যা তাদেরকে স্ট্যাটিকালি ওরিয়েন্টেড হিসাবে চিহ্নিত হিসাবে চিহ্নিত অ্যাপ্লিকেশনগুলিতে ওরিয়েন্টেশন পরিবর্তন করতে বাধ্য করে। এটি আমার ব্যক্তিগত ফোনে এবং আমাদের গ্রুপ ব্যবহার করে এমন অনেকগুলি ফোন ফোনে (ড্রয়েড, এন 1, জি 1, নায়ক সহ) বেশ খানিকটা ঘটে। সাধারণত কোনও অ্যাপ স্ট্যাটিক্যাল ওরিয়েন্টেড (সম্ভবত উল্লম্বভাবে) হিসাবে চিহ্নিত হিসাবে একটি অনুভূমিক অবস্থান ব্যবহার করে দ্বিতীয় বা দু'বারের জন্য নিজেকে আলাদা করে রাখবে এবং তারপরে তত্ক্ষণাত পিছনে ফিরে যাবে। শেষ ফলাফলটি হ'ল যদিও আপনি নিজের অ্যাপ্লিকেশনটি ওরিয়েন্টেশন পরিবর্তন করতে চান না, আপনাকে প্রস্তুত থাকতে হবে যে এটি হতে পারে। আমি জানি না যে সঠিক অবস্থার অধীনে এই আচরণটি পুনরুত্পাদন করা যেতে পারে, আমি জানি না এটি অ্যান্ড্রয়েডের কোনও সংস্করণের সাথে নির্দিষ্ট কিনা। আমি কেবল জানি এটি অনেক সময় ঘটতে দেখেছি :(

আমি আপনার পোস্ট করা লিঙ্কটিতে প্রদত্ত সমাধানটি ব্যবহার করার পরামর্শ দিচ্ছি যা পরামর্শ দেয় যে ক্রিয়াকলাপ ডায়ালগ পদ্ধতিটি অ্যাক্টিভিটি ওভাররাইড করে এবং অ্যান্ড্রয়েড ওএসকে আপনার ডায়ালগগুলির জীবনকাল পরিচালনা করতে দেয়। আপনার কার্যকলাপটি ওরিয়েন্টেশনগুলি স্যুইচ করতে না চাইলেও এটি আমার কাছে এমন মনে হচ্ছে, এটি কোথাও ওরিয়েন্টেশনকে স্যুইচ করছে। আপনি এমন একটি পদ্ধতি অনুসরণ করার চেষ্টা করতে পারেন যা সর্বদা ওরিয়েন্টেশন স্যুইচিংকে প্রতিরোধ করবে, তবে আমি আপনাকে বলতে চেষ্টা করছি যে আমি ব্যক্তিগতভাবে বিশ্বাস করি না যে একটি বোকা উপায় আছে যা বাজারের সমস্ত অ্যান্ড্রয়েড ফোনগুলিতে কাজ করে।


1
আপনি আপনার ডিভাইসটি ওরিয়েন্টেশনগুলি স্যুইচিং থেকে আটকে রাখতে পারেন, তবে এমন আরও কিছু কনফিগার পরিবর্তন রয়েছে যা আপনার ক্রিয়াকলাপকে ধ্বংস / পুনঃনির্মাণ করে - একটি সাধারণ যা কীবোর্ডটি স্লাইড করে বা বাইরে চলে যায়।
ম্যাক্সিমিয়ামগোট

2

আমার বেশিরভাগ সময় যা কাজ করেছে তা হ'ল কার্যকলাপ শেষ হচ্ছে না কিনা তা যাচাই করা।

if (!mActivity.isFinishing()) {
    dialog.dismiss();
}

2

ক্রিয়াকলাপটি ঘোরানো বা কীবোর্ড স্লাইড দ্বারা পুনরায় তৈরি করা হবে না বলে ঘোষণা করা হয়।

ঠিক একই সমস্যা পেয়েছি। 13 স্তরের বা হাইজারের জন্য ঠিক করুন।
অ্যান্ড্রয়েড ডক্স থেকে:

দ্রষ্টব্য: যদি আপনার অ্যাপ্লিকেশনটি এপিআই লেভেল 13 বা ততোধিক (minSdkVersion এবং টার্গেটএসডিকি ভার্সন বৈশিষ্ট্যগুলির দ্বারা ঘোষিত) হিসাবে লক্ষ্য করে তবে আপনার "স্ক্রিনসাইজ" কনফিগারেশনটিও ঘোষণা করা উচিত, কারণ কোনও ডিভাইস প্রতিকৃতি এবং ল্যান্ডস্কেপ ওরিয়েন্টেশনের মধ্যে স্যুইচ করলে এটিও পরিবর্তিত হয়।

সুতরাং আমি আমার প্রকাশকে এটিতে পরিবর্তন করেছি:

<activity
        android:name="MyActivity"
        android:configChanges="orientation|screenSize"
        android:label="MyActivityName" >
</activity>

এবং এখন এটি ঠিক আছে। আমি ফোনটি ঘোরানোর সময় ক্রিয়াকলাপটি পুনরায় শুরু করা হয় না, অগ্রগতি ডায়ালগ এবং দর্শন একই থাকে। আমার জন্য কোন ত্রুটি।


এটি কোনও সমাধান নয়। উদাহরণস্বরূপ আমার কাছে অ্যাডমব থেকে অ্যাডভিউ ক্রিয়াকলাপ রয়েছে এবং এটি আকার পরিবর্তনের জন্য ক্রিয়াকলাপটি পুনরায় তৈরি করা উচিত।
ব্যাটম্যাচি

2

প্রথমে আপনি যেখানেই ডায়ালগটি খারিজ করার চেষ্টা করছেন ততক্ষণ ত্রুটিটি পরিচালনা করুন।

 if ((progressDialog != null) && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }

যদি এটি ঠিক না হয়ে থাকে তবে ক্রিয়াকলাপের অনটপ () পদ্ধতিতে এটি খারিজ করুন।

 @Override
    protected void onStop() {
        super.onStop();
        if ((progressDialog != null) && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    }

1

সার্ভার থেকে একটি তালিকা সিঙ্ক করতে বোতামটি ব্যবহার করার সময় আমার একই সমস্যা ছিল: 1) আমি বোতামটি ক্লিক করি 2) সার্ভার 3 থেকে তালিকাটি ডাউনলোড করার সময় একটি অগ্রগতি ডায়ালগ প্রদর্শিত হয়)) আমি ডিভাইসটিকে অন্য অভিযোজনে পরিণত করি 4) জাভা.লং .IllegalArgumentException: প্রগতি.ডিজমিস () এর সময় অ্যাসিঙ্কটাস্কের পোস্টএক্সেকিউট () এ উইন্ডো ম্যানেজারের সাথে সংযুক্ত নেই।

আমি ঠিক করার চেষ্টা করার সাথে সাথে আমি বুঝতে পেরেছিলাম যে সমস্যাটি না ঘটলেও আমার তালিকাটি সমস্ত আইটেম প্রদর্শন করছে না।

আমি বুঝতে পেরেছিলাম যে অ্যাসিঙ্কটাস্কের জন্য আমি যা চেয়েছিলাম তা হল ক্রিয়াকলাপটি বিন্যস্ত হওয়ার আগেই (এবং কথোপকথনটি খারিজ করে), তাই আমি অ্যাসিনটাস্ক বস্তুকে একটি বৈশিষ্ট্য হিসাবে তৈরি করেছি এবং অনটাস্ট্রয়ে () পদ্ধতিটি ওভাররাইড করেছি।

যদি অ্যাসিঙ্কটাস্ক অনেক সময় নেয় তবে ব্যবহারকারী সম্ভবত ডিভাইসটি ধীরগতিতে অনুভব করবেন তবে আমি মনে করি অগ্রগতি ডায়ালগটি প্রদর্শিত হচ্ছে এমন সময় ডিভাইস অভিমুখীকরণ পরিবর্তনের চেষ্টা করার জন্য তিনি যে মূল্য দিয়েছিলেন that's এমনকি কিছু সময় নিলেও অ্যাপটি ক্রাশ হয় না।

private AsyncTask<Boolean, Void, Boolean> atask;

@Override
protected void onDestroy() {
    if (atask!=null)
        try {
            atask.get();
        } catch (InterruptedException e) {
        } catch (ExecutionException e) {
        }
    super.onDestroy();
}

1
@Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);

            if (progressDialog != null && progressDialog.isShowing()) {
                Log.i(TAG, "onPostexucte");
                progressDialog.dismiss();
}
}

3
যদিও এই কোড স্নিপেট সমস্যার সমাধান করে তার কিছু ব্যাখ্যা প্রদান করে এমন প্রশ্নের উত্তর দিতে পারে
যেগুলি

0

নীচের কোডটি আপনার জন্য কাজ করে, এটি আমার পক্ষে পুরোপুরি সূক্ষ্মভাবে কাজ করে:

private void viewDialog() {
    try {
        Intent vpnIntent = new Intent(context, UtilityVpnService.class);
        context.startService(vpnIntent);
        final View Dialogview = View.inflate(getBaseContext(), R.layout.alert_open_internet, null);
        final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
                        | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_DIM_BEHIND,
                PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.CENTER_VERTICAL;
        windowManager.addView(Dialogview, params);

        Button btn_cancel = (Button) Dialogview.findViewById(R.id.btn_canceldialog_internetblocked);
        Button btn_okay = (Button) Dialogview.findViewById(R.id.btn_openmainactivity);
        RelativeLayout relativeLayout = (RelativeLayout) Dialogview.findViewById(R.id.rellayout_dialog);

            btn_cancel.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            try {
                                if (Dialogview != null) {
//                                ( (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                                    windowManager.removeView(Dialogview);
                                }
                            } catch (final IllegalArgumentException e) {
                                e.printStackTrace();
                                // Handle or log or ignore
                            } catch (final Exception e) {
                                e.printStackTrace();
                                // Handle or log or ignore
                            } finally {
                                try {
                                    if (windowManager != null && Dialogview != null) {
//                                    ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                                        windowManager.removeView(Dialogview);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                            //    ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
//                        windowManager.removeView(Dialogview);


                        }
                    });
                }
            });
            btn_okay.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            //        ((WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE)).removeView(Dialogview);
                            try {
                                if (windowManager != null && Dialogview != null)
                                    windowManager.removeView(Dialogview);
                                Intent intent = new Intent(getBaseContext(), SplashActivity.class);
                                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
//                        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


                                context.startActivity(intent);
                            } catch (Exception e) {
                                windowManager.removeView(Dialogview);
                                e.printStackTrace();
                            }
                        }
                    });
                }
            });
        } catch (Exception e) {
            //` windowManager.removeView(Dialogview);
            e.printStackTrace();
        }
    }

আপনি যদি পটভূমি পরিষেবা থেকে কল করেন তবে বিশ্বব্যাপী আপনার দৃষ্টিভঙ্গি সংজ্ঞায়িত করবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.