ক্রিয়াকলাপটি মূলত যুক্ত হওয়া উইন্ডো ফাঁস করেছে


1159

এই ত্রুটিটি কী এবং কেন এটি ঘটে?

05-17 18:24:57.069: ERROR/WindowManager(18850): Activity com.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850): android.view.WindowLeaked: Activity ccom.mypkg.myP has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44c46ff0 that was originally added here
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.ViewRoot.<init>(ViewRoot.java:231)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.Dialog.show(Dialog.java:239)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP$PreparePairingLinkageData.onPreExecute(viewP.java:183)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.AsyncTask.execute(AsyncTask.java:391)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.mypkg.myP.onCreate(viewP.java:94)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2544)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2621)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.access$2200(ActivityThread.java:126)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1932)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.Handler.dispatchMessage(Handler.java:99)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.os.Looper.loop(Looper.java:123)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at android.app.ActivityThread.main(ActivityThread.java:4595)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at java.lang.reflect.Method.invokeNative(Native Method)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at java.lang.reflect.Method.invoke(Method.java:521)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
05-17 18:24:57.069: ERROR/WindowManager(18850):     at dalvik.system.NativeStart.main(Native Method)

6
অন্যান্য সর্বোত্তম যখন স্থিতিবিন্যাস পরিবর্তন হল: stackoverflow.com/questions/1111980/...
RDS

উত্তর:


1559

আপনি কোনও কার্যকলাপ থেকে বেরিয়ে আসার পরে একটি ডায়ালগ দেখানোর চেষ্টা করছেন।

[Edit]

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

উত্তর 1 :

আপনি কোনও কার্যকলাপ থেকে বেরিয়ে আসার পরে একটি ডায়ালগ দেখানোর চেষ্টা করছেন।

উত্তর 2

এই ত্রুটিটি কিছু পরিস্থিতিতে কিছুটা বিভ্রান্তিকর হতে পারে (যদিও উত্তরটি এখনও পুরোপুরি নির্ভুল) - যেমন আমার ক্ষেত্রে একটি অযথিত ব্যতিক্রম একটি এসিঙ্কটাস্কে নিক্ষেপ করা হয়েছিল, যার ফলে ক্রিয়াকলাপ বন্ধ হয়ে যায়, তখন একটি উন্মুক্ত অগ্রগতি ডায়ালগ এই ব্যতিক্রম ঘটায় .. 'আসল' ব্যতিক্রমটি লগতে কিছুটা আগে ছিল

উত্তর 3

আপনার ক্রিয়াকলাপটি প্রস্থান করার আগে আপনি যে ডায়ালগ ইভেন্টটি তৈরি করেছেন তাতে কলটি বরখাস্ত করুন () অনপস () বা অনডাস্ট্রয়ে ()


2
@ ওপরে পাবলিক অকার্যকর onShop () {if (কথোপকথন! = নাল) {কথোপকথন.ত্যাগ (); কথোপকথন = নাল; }}
মোঃ তারিকুল ইসলাম

14
8 বছর পরেও এটি এখনও প্রাসঙ্গিক! আমি ব্যতিক্রম পেয়েছি কারণ আমার অ্যালার্টডায়ালগটি প্রদর্শনের চেষ্টা করার সময় কার্যকলাপটি বন্ধ ছিল (সুতরাং উত্তর 2)। শেষ পর্যন্ত আমি জানতে পারলাম অ্যাপটি দৃশ্যে একটি "নাল" অবজেক্ট যুক্ত করছে (এটি হওয়া উচিত ছিল না তবে এটি হয়েছিল) তবে এটি এর জন্য কোনও অতিরিক্ত ব্যতিক্রম দেয়নি এবং পুরো বিষয়টি "ফাঁস" দ্বারা মুখোশযুক্ত ছিল উইন্ডো "পরিবর্তে ব্যতিক্রম।
নেফ

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

1
উত্তর 3 সেরা সমাধান। আমার জন্য অনেক কাজ। ধন্যবাদ কাজী, অ্যালেক্স !!
অমিত বনসোড

অতিরিক্ত টিপস যদি আপনি কোনও
লুপটিতে সংলাপটি

404

সমাধান কল হয় dismiss()উপর Dialogআপনি তৈরি viewP.java:183প্রস্থান করার পূর্বে Activity, যেমন মধ্যে onPause()। একটি ছাড়ার আগে সমস্ত Windowগুলি Dialogবন্ধ করে দেওয়া উচিত Activity


3
ব্যবহারকারী যখন ফোনটি ঘোরান তখন সমস্ত ডায়ালগ খারিজ করা উচিত ?? এটি ঠিক শোনাচ্ছে না।
LarsH

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

108

আপনি যদি ব্যবহার করে থাকেন তবে AsyncTaskসম্ভবত সেই লগ বার্তাটি ভ্রান্ত হতে পারে। আপনি যদি আপনার লগটিতে সন্ধান করেন তবে আপনি সম্ভবত অন্য একটি ত্রুটি আবিষ্কার করতে পারেন, সম্ভবত আপনার doInBackground()পদ্ধতিতে AsyncTaskএটি একটি আপনার বর্তমানকে প্রস্ফুটিত Activityকরে তুলছে এবং এভাবে একবার AsyncTaskফিরে আসার পরে ... ভাল, আপনি বাকীটি জানেন। আরও কিছু ব্যবহারকারী ইতিমধ্যে এখানে ব্যাখ্যা করেছেন :-)


22
কখনও কখনও সেই ক্ষেত্রে আমি আসল ব্যতিক্রম দেখতে সক্ষম হই না। আসল ব্যতিক্রম সন্ধানের জন্য কেবল অগ্রগতি ডায়ালগ.শো () মন্তব্য করে আবার অ্যাপটি চালাও .. এখন আপনি এটি দেখতে পাচ্ছেন।
আটকে আছে

হাই বাউল! @ স্টক দ্বারা উপরে উল্লিখিত হিসাবে আমি আসল ব্যতিক্রমটিও দেখতে পাচ্ছি না, আমি কী করেছি? আমি ভঙ্গ পয়েন্ট ব্যবহার করে এটি ট্র্যাক এবং আমি যে আমি পদ্ধতি ভিতরে একটি অ্যাপ্লিকেশন ক্লাসের একটি রেফারেন্স ব্যবহার করছিলেন আবিষ্কৃত doInBackgroundএর AsyncTaskমধ্যে বর্গ কিন্তু কি তা মেনে নেবে ছাড়া AndroidManifestফাইল সম্পত্তি ব্যবহার android:nameভালো: android:name="my.package.MyApplicationClass"AsyncTaskএটি ব্যবহার করার সময় একটি ভাল অনুশীলনটি সর্বদা আপনার সতর্কতাটি পদ্ধতির অভ্যন্তরে ইনস্ট্যান্ট করা onPreExecuteএবং এটিকে বরখাস্ত করার বিষয়টি মনে রাখা উচিত onPostExecute
জিএফপিএফ

66

আমি ভুল করে কল করে এই ত্রুটি আলোড়ন সৃষ্টি hide()পরিবর্তে dismiss()একটি অন AlertDialog


4
হুবহু আমার কি হয়েছে। এছাড়াও, হাইড () কল করে এবং তারপরে ডায়ালগটি নালায় সেট করা বৈধ বিকল্প নয়।
লুকাস তুলিও

আমি সত্যিই এর পিছনে বিষয়টি জানতে হবে। কিন্তু বরখাস্ত করা () আমাকে সাহায্য করেছে!
করলি

59

আপনি এই ব্যতিক্রমটি কেবল একটি সাধারণ / বোবা ভুল দ্বারা পেতে পারেন, (উদাহরণস্বরূপ) finish()একটি প্রদর্শিত হওয়ার পরে দুর্ঘটনাক্রমে কল করে AlertDialog, যদি আপনি একটি স্যুইচ বিবৃতিতে ব্রেক কল স্টেটমেন্ট মিস করেন ...

   @Override
   public void onClick(View v) {
    switch (v.getId()) {
        case R.id.new_button:
            openMyAlertDialog();
            break; <-- If you forget this the finish() method below 
                       will be called while the dialog is showing!
        case R.id.exit_button:
            finish();
            break;
        }
    }

finish()পদ্ধতি বন্ধ হয়ে যাবে Activity, কিন্তু AlertDialogএখনও প্রদর্শন করা হয়!

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


কমবেশি ঠিক আমার সমস্যা। ডায়ালগ তৈরি হওয়ার পরে অন ইয়ারে ফিনিস বলা হয়, বরখাস্ত বোতামের জন্য অন ক্লিকে নয়।
jbass

45

এই প্রশ্নের উত্তরগুলি সবই সঠিক ছিল, তবে আসলে কেন তা বুঝতে আমার জন্য কিছুটা বিভ্রান্তি। প্রায় ২ ঘন্টা খেলার পরে এই ত্রুটির কারণ (আমার ক্ষেত্রে) আমাকে আঘাত করেছে:

আপনি অন্যান্য উত্তরগুলি পড়ে ইতিমধ্যে জানেন, এর X has leaked window DecorView@d9e6131[]ত্রুটির অর্থ হ'ল আপনার অ্যাপ্লিকেশনটি বন্ধ হয়ে গেলে একটি ডায়ালগ খোলা হয়েছিল। কিন্তু কেন?

এটি হতে পারে, আপনার ডায়ালগটি খোলা থাকার সময় আপনার অ্যাপটি অন্য কোনও কারণে ক্র্যাশ হয়েছিল

এটি আপনার কোডটিতে কিছু ত্রুটির কারণে আপনার অ্যাপ্লিকেশনটি বন্ধ হয়ে যায়, যা অন্য ত্রুটির কারণে আপনার অ্যাপ্লিকেশনটি বন্ধ হয়ে যাওয়ার সাথে সাথে ডায়ালগটি খোলা থাকে।

সুতরাং, আপনার যৌক্তিক মাধ্যমে দেখুন। প্রথম ত্রুটিটি সমাধান করুন এবং তারপরে দ্বিতীয় ত্রুটিটি নিজেই সমাধান করবেএখানে চিত্র বর্ণনা লিখুন

একটি ত্রুটি অন্যটির কারণ হয়, যা ডমিনোসের মতো অন্যটির কারণ হয়!


2
বিশ্বাস করতে পারি না এটির একটি মাত্র উত্থান আছে .. বা আমরা প্রোগ্রামিংয়ে খুব খারাপ হয়েছি
হাহাহা আমিও

প্রথম ত্রুটিটি সমাধান করুন এবং দ্বিতীয় ত্রুটি ঘটবে না । এই উপমাটি আমাকে সহায়তা করেছিল।
itabdullah

এটি পুরোপুরি ঠিক নয়, ফোন ঘোরানোর মতো উদাহরণগুলি "ক্রিয়াকলাপ" রোটেশন ঘটতেও পারে।
শ্রীকান্ত করুণাঘাট

36

আপনি কোনও ক্রিয়াকলাপ থেকে বেরিয়ে আসার পরে একটি ডায়ালগ দেখানোর চেষ্টা করার সময় এই সমস্যাটি দেখা দেয়।

আমি কেবল নিম্নলিখিত কোডটি লিখে কেবল এই সমস্যাটি সমাধান করেছি:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( progressDialog!=null && progressDialog.isShowing() ){
        progressDialog.cancel();
    }
}

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


onDestroy কল করার নিশ্চয়তা নেই।
অন-

19

আমি সম্প্রতি একই সমস্যার মুখোমুখি হয়েছি।

এই সমস্যার পেছনের কারণ হ'ল ডায়লগটি খারিজ হওয়ার আগে কার্যকলাপটি বন্ধ করা হচ্ছে। উপরোক্ত হওয়ার বিভিন্ন কারণ রয়েছে। উপরের পোস্টগুলিতে উল্লিখিত পোস্টগুলিও সঠিক।

আমি একটি পরিস্থিতিতে পড়েছিলাম, কারণ থ্রেডে, আমি একটি ফাংশন বলছিলাম যা ব্যতিক্রম ছুঁড়েছিল। যার কারণে উইন্ডোটি বরখাস্ত হচ্ছিল এবং তাই ব্যতিক্রম।


16

ক্রিয়াকলাপটি নষ্ট হয়ে গেলে ডায়ালগটি বাতিল করুন

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

যদি পিডায়ালগটি নাল হয় তবে আপনি নাল কথোপকথনের অবস্থাটি জিজ্ঞাসা করার সময় এটি একটি ত্রুটি ফেলবে
জোনাথন ডান

1
না এটি @ জনডান করবে না, কারণ জাভা দ্বিতীয় বুলিয়ান প্রক্রিয়া করবে না যদি প্রথমটি মিথ্যা হয়
ম্যাটদেব

13

এটি সাহায্য করতে পারে।

if (! isFinishing()) {

    dialog.show();

    }

2
অনুরূপ শত শত উত্তরের মধ্যে উইন্ডোজ রয়েছে কিনা তা পরীক্ষা করে দেখানোর জন্য কেউ নেই। সুতরাং আপনি কিছু করার উপায়টি খুঁজে পেতে আমাকে কিছুটা সময় সাশ্রয় করুন। ধন্যবাদ।
কোলিয়াশেগ

11

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


লক্ষ্য করা গেছে যে আমি কল () কল করার আগে একটি এমডায়ালগহাইড () করছিলাম। এটিকে mDialog.dismiss () এ পরিবর্তন করে কৌশলটি করেছেন।
mays

11

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

@Override
protected void onPause()
{
    Log.v("MediaVideo", "onPause");
    super.onPause();
    this.mVideoView.pause();
    this.mVideoView.setVisibility(View.GONE);
}

@Override
protected void onDestroy()
{
    Log.v("MediaVideo", "onDestroy");
    super.onDestroy();
}

@Override
protected void onResume()
{
    Log.v("MediaVideo", "onResume");
    super.onResume();
    this.mVideoView.resume();
}

ওভাররাইড OnPauseথেকে কল সঙ্গে mVideoView.pause()এবং সেট visibilityকরার GONE। এইভাবে আমি Activity has leaked windowলগ ত্রুটির সমস্যাটি সমাধান করতে পারি could


আমিও একই সমস্যার মুখোমুখি। আমি এই
কোডগুলিকে আমার কোডটিতে যুক্ত

10

আমি একই সমস্যাটি পেয়েছিলাম এবং এই পৃষ্ঠাটি পেয়েছি এবং আমার পরিস্থিতি অন্যরকম হওয়ার আগে আমি finishএকটি ifব্লক থেকে সতর্কতা বাক্সটি সংজ্ঞায়নের আগে ফোন করেছি।

সুতরাং, কেবল কল করা dismissকাজ করবে না (কারণ এটি এখনও তৈরি হয়নি) তবে অ্যালেক্স ভলভয়ের উত্তর পড়ার পরে এবং বুঝতে পেরে এটি সতর্কতা বাক্সটি হয়েছিল। আমি সেই ifব্লকের ভিতরে শেষ হওয়ার পরে একটি রিটার্ন বিবৃতি যুক্ত করার চেষ্টা করেছি এবং এটি সমস্যার সমাধান করেছে।

আমি ভেবেছিলাম আপনি একবার ফিনিস বললে এটি সবকিছু বন্ধ হয়ে যায় এবং ঠিক সেখানেই শেষ হয়ে যায়, তবে তা হয় না। দেখে মনে হচ্ছে এটির ব্লক কোডের শেষে এটি শেষ হয়েছে।

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

private picked(File aDirectory){
     if(aDirectory.length()==0){
        setResult(RESULT_CANCELED, new Intent()); 
        finish(); 
        return;
    }
     AlertDialog.Builder alert= new AlertDialog.Builder(this); // Start dialog builder
     alert
        .setTitle("Question")
        .setMessage("Do you want to open that file?"+aDirectory.getName());
    alert
        .setPositiveButton("OK", okButtonListener)
        .setNegativeButton("Cancel", cancelButtonListener);
    alert.show();
}

আমি সেখানে ফিনিস বলার পরে যদি আপনি সঠিকভাবে রিটার্নটি না রাখেন তবে এটি এটির মতো কাজ করবে যা আপনি এটির পরে বলেছিলেন alert.show();এবং তাই এটি বলবে যে ডায়ালগটি প্রদর্শিত হওয়ার ঠিক পরে উইন্ডোটি ফাঁস হয়ে গেছে, যদিও তা ঘটনাটি নয়, এটি এখনও এটি মনে হয়।

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


7

এটি প্রশ্নের উত্তর নয় তবে এটি বিষয়ের সাথে প্রাসঙ্গিক।

যদি ক্রিয়াকলাপটি ম্যানিফেস্টে কোনও গুণকে সংজ্ঞায়িত করে

 android:noHistory="true"

তারপরে অনপজ () চালানোর পরে, ক্রিয়াকলাপের প্রসঙ্গটি হারিয়ে যায়। সুতরাং সমস্ত দৃশ্যের এই প্রসঙ্গটি ব্যবহার করা এই ত্রুটিটি দিতে পারে।


আপনি কিছু জন্য অনুরূপ সম্পর্কযুক্ত হতে পারে progessdialog.show().. এবং progressdialog.hide()asynctaskএকই কার্যকলাপের পরিবর্তে onPause()থেকে activity?? আমার সমস্যা কটাক্ষপাত আছে ... stackoverflow.com/questions/39332880/...
Bhuro

1
এটি আমার জন্য নিখুঁতভাবে কাজ করছে: অ্যান্ড্রয়েড: নোহোস্টরি = "সত্য"
রানা

6

কেবলমাত্র একটি সতর্কতা দেখানোর চেষ্টা করবেন না তবে যখন আপনি কোনও নির্দিষ্ট ক্রিয়াকলাপ শেষ করেন এবং নতুন ক্রিয়াকলাপ / পরিষেবা শুরু করার চেষ্টা করেন বা এটি বন্ধ করার চেষ্টা করেন তখন তাও আহ্বান করা যেতে পারে।

উদাহরণ:

OldActivity instance;

    oncreate() {
       instance=this;
    }
    instance.finish();
    instance.startActivity(new Intent(ACTION_MAIN).setClass(instance, NewActivity.class));

6

সাধারণত অগ্রগতি সংলাপের কারণে এই সমস্যাটি দেখা দেয়: আপনি আপনার ক্রিয়াকলাপে নিম্নলিখিত যে কোনও একটি পদ্ধতি ব্যবহার করে সমাধান করতে পারেন:

 // 1):
          @Override
                protected void onPause() {
                    super.onPause();
                    if ( yourProgressDialog!=null && yourProgressDialog.isShowing() )
                  {
                        yourProgressDialog.cancel();
                    }
                }

       // 2) :
         @Override
            protected void onDestroy() {
                super.onDestroy();
                if ( yourProgressDialog!=null && yourProgressDialog.isShowing()
               {
                    yourProgressDialog.cancel();
                }
            }

5

প্রগ্রেসডায়ালগটি যখন দেখানো হয়েছিল তখন আমি কোনও ক্রিয়াকলাপ শেষ করেছিলাম এমন সমস্যা ছিল।

তাই প্রথমে ডায়ালগটি লুকান এবং তারপরে ক্রিয়াকলাপ শেষ করুন।


5

এই কোড ব্যবহার করে দেখুন:

public class Sample extends Activity(){
@Override
 public void onCreate(Bundle instance){

}
 @Override
    public void onStop() {
        super.onStop();
      progressdialog.dismiss(); // try this
    }

}

progressdialog.dismiss();এটি নালপয়েন্টার এক্সসেপশন তৈরি করতে পারে।
tpk

5

এটি যদি আপনার কার্যক্রমে কোনও ত্রুটি doInBackground()থাকে এবং এই কোডটি থাকে তবে এটি হতে পারে ।

শেষ পর্যন্ত ডায়লগ যুক্ত করার চেষ্টা করুন। প্রথমে চেক এবং ফিক্স doInBackground()ফাংশন

protected void onPreExecute() {
     super.onPreExecute();
     pDialog = new ProgressDialog(CreateAccount.this);
     pDialog.setMessage("Creating Product..");
     pDialog.setIndeterminate(false);
     pDialog.setCancelable(true);
     pDialog.show();

 }

 protected String doInBackground(String...args) {
     ERROR CAN BE IS HERE
 }

 protected void onPostExecute(String file_url) {
     // dismiss the dialog once done
     pDialog.dismiss();

5

এই যখন আমি ব্যবহার করছি আমার ঘটেছে ProgressDialogমধ্যে AsyncTask। আসলে আমি hide()পদ্ধতি ব্যবহার করছি onPostExecute। @Alex Volovoy উত্তর উপর ভিত্তি করে আমি ব্যবহার করতে হবে dismiss()সঙ্গে ProgressDialogonPostExecute এবং তার কাজ এটা মুছে ফেলার জন্য।

progressDialog.hide(); // Don't use it, it gives error

progressDialog.dismiss(); // Use it

এটি আসলে পুরো উত্তর নয়। একটি কথোপকথন ফাঁস করার দুটি উপায় রয়েছে। 1) যদি আপনার একটি থাকে AsyncTaskএবং আপনি এটি দেখান Dialog, তবে এমন কিছু ঘটে যা Activityকল করে onPause()(সম্ভবত আপনার অ্যাসিঙ্কটাস্কে কিছু যুক্তি দিয়েছিল, শ্রোতার মতো, তবে এটি ফাঁস হবে 2) উপরে উল্লিখিত হিসাবে, Dialogযা দিয়ে তৈরি হয়েছিল Activity Contextতা কখনই হয় না বরখাস্ত এবং Activityপদক্ষেপ।
ট্রিকনোলজি

5

Activity has leaked window that was originally added...আপনি যখন Activityকার্যকরভাবে কার্যকর হওয়ার পরে সতর্কতা দেখানোর চেষ্টা করেন তখন " " ত্রুটি দেখা দেয় finished

আপনার কাছে দুটি বিকল্প আছে আফাইক:

  1. আপনার সতর্কতার লগইনটিকে নতুন করে দেখুন: আসলে আপনার ক্রিয়াকলাপটি প্রস্থান dismiss()করার dialogআগে কল করুন ।
  2. dialogএটিকে একটি আলাদা থ্রেডে রাখুন এবং এটি thread(স্রোতের চেয়ে পৃথক activity) এ চালান ।

5

আপনি যখন সতর্কতা ডায়ালগকে বরখাস্ত করতে চান তবে কার্যকলাপের অভ্যন্তরে এটির কোনও রেফারেন্স রাখতে চান না এমন একটি সমাধান এখানে here

সমাধানটির জন্য আপনার প্রকল্পে androidx.lifecycle নির্ভরতা থাকা দরকার (আমি মন্তব্য করার মুহূর্তে এটি একটি সাধারণ প্রয়োজনীয়তা বিশ্বাস করি)

এটি আপনাকে বাহ্যিক বস্তুর (পর্যবেক্ষক) ডায়ালগের বরখাস্ত করার অনুমতি দেয় এবং আপনাকে আর এটির যত্ন নেওয়ার দরকার নেই, কারণ ক্রিয়াকলাপটি মারা যাওয়ার পরে এটি স্বয়ংক্রিয়ভাবে সাবস্ক্রাইব হয়। (এখানে প্রমাণ: https://github.com/googlecodelabs/android-lifecycles/issues/5 )।

সুতরাং, পর্যবেক্ষক সংলাপের রেফারেন্স রাখে এবং ক্রিয়াকলাপ পর্যবেক্ষকের কাছে রেফারেন্স রাখে। যখন "অনপজ" ঘটে - পর্যবেক্ষক ডায়ালগটি বাতিল করে দেয় এবং যখন "অনডাস্ট্রয়" ঘটে - ক্রিয়াকলাপ পর্যবেক্ষককে সরিয়ে দেয়, তাই কোনও ফাঁস ঘটে না (ভাল, কমপক্ষে আমি আর লগকটে ত্রুটি দেখতে পাচ্ছি না)

// observer
class DialogDismissLifecycleObserver( private var dialog: AlertDialog? ) : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun onPause() {
        dialog?.dismiss()
        dialog = null
    }
}
// activity code
private fun showDialog() {
        if( isDestroyed || isFinishing ) return
        val dialog = AlertDialog
            .Builder(this, R.style.DialogTheme)
            // dialog setup skipped
            .create()
        lifecycle.addObserver( DialogDismissLifecycleObserver( dialog ) )
        dialog.show()
}

4

উইন্ডো ফাঁস ব্যতিক্রমগুলির দুটি কারণ রয়েছে:

1) ক্রিয়াকলাপ প্রসঙ্গে উপস্থিত না থাকলে ডায়ালগটি দেখানো, সমাধান করার জন্য আপনার কেবলমাত্র ডায়ালগটি দেখানো উচিত কার্যকলাপের উপস্থিতি নিশ্চিত:

if(getActivity()!= null && !getActivity().isFinishing()){
        Dialog.show();
}

2) এই কোডটি ব্যবহার করার জন্য ডায়ালগটিকে যথাযথভাবে বরখাস্ত করবেন না:

@Override
public void onDestroy(){
    super.onDestroy();
    if ( Dialog!=null && Dialog.isShowing() ){
        Dialog.dismiss();
}
}

4

আপনাকে পদ্ধতিতে Progressdialogঅবজেক্ট তৈরি করতে হবে এবং onPreExecuteপদ্ধতিতে এটি করা AsyncTaskউচিত ।dismissonPostExecute


4

সেরা সমাধানটি হ'ল ডায়ালগ যুক্ত করার চেষ্টা করুন এবং ব্যতিক্রম ঘটলে ডায়ালগটি খারিজ করুন

শুধু কোড নীচে ব্যবহার করুন

 try {
        dialog.show();
    } catch (Exception e) {
        dialog.dismiss();
    }

3
ডায়লগটি শেষ হওয়ার পরেও বাতিল হবে না?, আমার মনে হয় dialog.dismiss()
ত্রুটিও

3

আমার ক্ষেত্রে, কারণটি ছিল যে আমি অ্যান্ড্রয়েড মেনিফেস্ট ফাইলটিতে কোনও অনুমতি অন্তর্ভুক্ত করতে ভুলে গিয়েছিলাম।

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


3

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

try {
        if (null != progressDialog && progressDialog.isShowing()) {
            progressDialog.dismiss();
            progressDialog = null;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

2

দেখানোর আগে progressbarবা এর আগে সেরা সমাধান দেওয়া হয়progressDialog

if (getApplicationContext().getWindow().getDecorView().isShown()) {

  //Show Your Progress Dialog

}

এটি আমার পক্ষে কাজ করে না। HTTP কল থেকে প্রতিক্রিয়া পাওয়ার পরে আমার ডায়ালগ.শো () রয়েছে এবং এর মধ্যে আমি যখন স্ক্রিনটি ঘোরান তখন ক্রিয়াকলাপটি বিচ্ছিন্ন হয় তবে মনে হয় এটিশাউন == সত্য ডায়ালগ.শো () এর পূর্বে এবং তারপরে এই চেক সত্ত্বেও ডায়ালগ ক্র্যাশ হয়েছে
মিশা জিওব্রো

1

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


1

এর জন্য আমার আরও একটি সমাধান রয়েছে, এবং এটি আপনার কাছে বৈধ বলে মনে হচ্ছে কিনা তা জানতে চাই: অগ্রণী সমাধান বলে মনে হচ্ছে অনডেস্ট্রয়কে বরখাস্ত করার পরিবর্তে, আমি প্রগ্রেসডায়ালগ বাড়িয়ে দিচ্ছি ...

public class MyProgressDialog extends ProgressDialog {

  private boolean isDismissed;

  public MyProgressDialog(Context context) {
    super(context);
  }

  @Override
  public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    dismiss();
  }

  @Override
  public void dismiss() {
    if (isDismissed) {
      return;
    }
    try {
      super.dismiss();
    } catch (IllegalArgumentException e) {
      // ignore
    }
    isDismissed = true;
  }

এটি এএফএইসি, এটি অগ্রাধিকারযোগ্য কারণ আপনাকে সদস্য হিসাবে অগ্রগতি কথোপকথনটি ধরে রাখতে হবে না, কেবল গুলি চালান (ভুলে যান) এবং ভুলে যান

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