ක්‍රියාකාරකම මුලින් එකතු කළ කවුළුව කාන්දු වී ඇත


1173

මෙම දෝෂය කුමක්ද, එය සිදුවන්නේ ඇයි?

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/...
නිවාරණ වැඩසටහන්

Answers:


1573

ඔබ ක්‍රියාකාරකමෙන් ඉවත් වූ පසු සංවාදයක් පෙන්වීමට උත්සාහ කරයි.

[සංස්කරණය කරන්න]

මෙම ප්‍රශ්නය ඇන්ඩ්‍රොයිඩ් සංවර්ධකයා සඳහා ගූගල් හි ඉහළම සෙවුමකි, එබැවින් අදහස් වලින් වැදගත් කරුණු කිහිපයක් එකතු කිරීම, අදහස් සංවාදයේ ගැඹුරට නොගොස් අනාගත විමර්ශකයාට වඩාත් ප්‍රයෝජනවත් වනු ඇත.

පිළිතුර 1 :

ඔබ ක්‍රියාකාරකමෙන් ඉවත් වූ පසු සංවාදයක් පෙන්වීමට උත්සාහ කරයි.

පිළිතුර 2

මෙම දෝෂය සමහර තත්වයන් තුළ මඳක් නොමඟ යවන සුළු විය හැකිය (පිළිතුර තවමත් සම්පූර්ණයෙන් නිවැරදි වුවද) - එනම්, මගේ නඩුවේදී පාලනයකින් තොරව ව්‍යතිරේකයක් අසින්ක් ටාස්ක් තුළට විසි කරන ලද අතර එය ක්‍රියාකාරකම් වසා දැමීමට හේතු විය, එවිට විවෘත ප්‍රගතිශීලී සංවාදයක් මෙම ව්‍යතිරේකයට හේතු විය .. එබැවින් 'සැබෑ' ව්‍යතිරේකය මඳක් කලින් ලොගයේ විය

පිළිතුර 3

ඔබගේ ක්‍රියාකාරකමෙන් ඉවත් වීමට පෙර ඔබ විසින් සාදන ලද ඩයලොග් උදාහරණයේ සේවයෙන් ඉවත් කරන්න () අමතන්න, උදා: onPause () හෝ onDestroy ()


3
StStop () {if (දෙබස්! = ශුන්‍ය) {dialog.dismiss (); දෙබස් = ශූන්‍ය; }}
එම්.ඩාරිකුල් ඉස්ලාම්

15
අවුරුදු 8 කට පසුව පවා මෙය තවමත් අදාළ වේ! මගේ ව්‍යතිරේකය ලැබුනේ එය මගේ ඇලර්ට් ඩයලොග් ප්‍රදර්ශනය කිරීමට උත්සාහ කරන අතරතුර ක්‍රියාකාරකම වසා ඇති බැවිනි (එබැවින් පිළිතුර 2). අවසානයේදී මම දැනගත්තා යෙදුම දර්ශනයට “ශූන්‍ය” වස්තුවක් එක් කරන බව (එය සිදු නොවිය යුතුව තිබුණත් එය එසේ විය යුතුය) නමුත් එය ඒ සඳහා අමතර ව්‍යතිරේකයක් ලබා නොදුන් අතර සියල්ලම “කාන්දු වූ” වෙස්මුහුණු කර ඇත කවුළුව "ව්‍යතිරේකය.
නෙප්

සියලුම විවෘත සංවාද සඳහා පරිලෝකනය කර ඒවා සියල්ල ඔන්ස්ටොප් () හි වසා දැමිය හැකිද? අයිතම මත ක්ලික් කිරීමේදී මම ලැයිස්තු දර්ශනයක සංවාද ජනනය කරමි. ඔවුන්ගේ යොමු කිරීම onStop වෙතින් ලබා ගන්නේ කෙසේදැයි මට විශ්වාස නැත.
මයෝච්

1
පිළිතුර 3 හොඳම විසඳුමයි. මා වෙනුවෙන් බොහෝ සෙයින් වැඩ කළා. ස්තූතියි කේස්, ඇලෙක්ස් !!
amit bansode

අමතර ඉඟිය ඔබ සංවාදය ලූපයක් තුළ ප්‍රදර්ශනය කරන්නේ නම් ක්‍රියාකාරකම් අවසන් වූ පසු ලූපය
පිටවන

407

විසඳුම කැඳවීමට ය dismiss()මත Dialogඔබ නිර්මාණය viewP.java:183පිටවීමට පෙර Activity, උදා onPause(). පිටවීමට පෙර සියළුම Windows & Dialogs වසා දැමිය යුතුය Activity.


3
ඉතින් පරිශීලකයා දුරකථනය කරකවන විට, සියලු සංවාද ඉවත දැමිය යුතුද ?? ඒක හරි නැහැ.
LarsH

ArLarsH ඔබට පෙනෙන පරිදි, මගේ පිළිතුර ලියා ඇත්තේ මීට වසර 7 කට පෙරය, මෙය එකල සත්‍යයකි. මම තවදුරටත් ඇන්ඩ්‍රොයිඩ් සමඟ වැඩ නොකරමි, නමුත් ප්‍රලේඛනයේ මා දකින දේ මත පදනම්ව එය තවමත් එසේ විය හැකිය, නමුත් ඇන්ඩ්‍රොයිඩ් බොහෝ දුරක් පැමිණ ඇත (ෆ්‍රැග්මන්ට්ස් හඳුන්වා දුන්නේ එකක් නම් කිරීම සඳහා පමණි), එබැවින් දැන් එය පහසු වනු ඇත.
molnarm

108

ඔබ භාවිතා කරන්නේ නම් AsyncTask, බොහෝ විට එම ලොග් පණිවිඩය රැවටිලිකාර විය හැකිය. ඔබ ඔබේ ලොගය දෙස බැලුවහොත්, ඔබට තවත් දෝෂයක් සොයා ගත හැකිය, බොහෝ විට ඔබේ doInBackground()ක්‍රමයේ එකක් විය හැකිය AsyncTask, එය ඔබේ ධාරාව Activityපුපුරවා හැරීමට හේතු වන අතර එමඟින් නැවත AsyncTaskපැමිණීමෙන් පසු .. හොඳයි, ඉතිරිය ඔබ දන්නවා. තවත් සමහර පරිශීලකයින් දැනටමත් මෙහි පැහැදිලි කර ඇත :-)


23
සමහර විට එවැනි අවස්ථාවක මට සැබෑ ව්‍යතිරේකය දැකිය නොහැක. සැබෑ ව්‍යතිරේකය සොයා ගැනීම සඳහා progressDialog.show () අදහස් දක්වමින් යෙදුම නැවත ධාවනය කරන්න .. දැන් ඔබට එය පෙනේ.
හිරවෙලා

ආයුබෝවන්! @ ස්ටක් විසින් ඉහත සඳහන් කළ පරිදි, සැබෑ ව්‍යතිරේකය ද මට නොපෙනේ, මා කළේ කුමක්ද? මම බිඳ ලකුණු භාවිතා කර දම්වැල් මත ධාවනය වන අතර මම එම ක්රමය තුල ඉල්ලුම් පන්තියේ යොමු භාවිතා කළ බව සොයා ගන්නා doInBackgroundපිළිබඳ AsyncTaskතුළ එය පන්ති නමුත් ප්රකාශ තොරව AndroidManifestදේපල ගොනුව භාවිතා android:nameමේ වගේ: android:name="my.package.MyApplicationClass". AsyncTaskඑය භාවිතා කරන විට හොඳ පුහුණුවක් සැමවිටම මතක තබා ගත යුත්තේ ඔබේ අනතුරු ඇඟවීම ක්‍රමවේදය තුළ ස්ථාපනය කර එය onPreExecuteබැහැර කිරීමයි onPostExecute.
ජීඑෆ්පීඑෆ්

67

මම වැරදීමකින් ඇමතීම මගින් මෙම දෝශය මුලපුරනු 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 තවමත් ප්රදර්ශනය වේ!

එබැවින් ඔබ කේතය දෙස උනන්දුවෙන් බලා සිටින විට, නරක නූල් ගැටලු හෝ සංකීර්ණ කේතීකරණයක් සොයන විට, ගස් සඳහා වනාන්තරය පිළිබඳ දෘෂ්ටිය නැති නොකරන්න. සමහර විට එය අතුරුදහන් වූ විවේක ප්‍රකාශයක් තරම් සරල හා ගොළු දෙයක් විය හැකිය. :)


වැඩි වශයෙන් හෝ අඩු වශයෙන් මගේ ප්‍රශ්නය. සංවාදයෙන් පසු onError හි අවසානය ලෙස හැඳින්වේ, සේවයෙන් ඉවත් කිරීමේ බොත්තම සඳහා onClick තුළ නොවේ.
jbass

46

මෙම ප්‍රශ්නයට පිළිතුරු සියල්ලම නිවැරදියි, නමුත් ඇත්ත වශයෙන්ම එයට හේතුව තේරුම් ගැනීමට මට ටිකක් ව්‍යාකූල විය. පැය 2 ක් පමණ සෙල්ලම් කිරීමෙන් පසු මෙම දෝෂයට හේතුව (මගේ නඩුවේ) මට පහර දුන්නේය:

වෙනත් පිළිතුරු කියවීමෙන් ඔබ සතුව ඇති X has leaked window DecorView@d9e6131[]දෝෂය යන්නෙන් අදහස් වන්නේ ඔබේ යෙදුම වසා දැමූ විට සංවාදයක් විවෘත වූ බවයි. නමුත් ඇයි?

ඔබගේ දෙබස විවෘතව තිබියදී වෙනත් හේතුවක් නිසා ඔබගේ යෙදුම බිඳ වැටීම විය හැකිය

ඔබගේ කේතයේ යම් දෝෂයක් නිසා මෙය ඔබගේ යෙදුම වැසීමට තුඩු දෙයි, අනෙක් දෝෂය හේතුවෙන් ඔබගේ යෙදුම වසා දැමූ අවස්ථාවේදීම දෙබස විවෘතව පවතී.

එබැවින්, ඔබේ තාර්කිකත්වය දෙස බලන්න. පළමු දෝෂය විසඳන්න, ඉන්පසු දෙවන දෝෂය විසඳෙනු ඇතරූප විස්තරය මෙහි ඇතුළත් කරන්න

එක් දෝෂයක් තවත් ඩොමිනෝස් වැනි තවත් හේතුවක් ඇති කරයි!


2
මෙම එක් upvote බව විශ්වාස කළ නොහැකි .. නැතිනම් අපි වැඩසටහන්ගත hahaha මම ඔබේ බලපෑ සාදෘශ්යයක් කැමති පමණයි ඇත්තටම නරකයි
user2161301

පළමු දෝෂය විසඳන්න, දෙවන දෝෂය සිදු නොවේ . මෙම ප්‍රතිසමය මට උපකාර විය.
ඉතබ්දුල්ලා

මෙය සම්පුර්ණයෙන්ම නිවැරදි නොවේ, දුරකථන භ්‍රමණය වැනි අවස්ථා ද "ක්‍රියාකාරකම්" භ්‍රමණය වීමට හේතු විය හැක.
ශ්‍රීකාන්ත් කරුණානගට්

විශිෂ්ට පැහැදිලි කිරීම (y)
HasH

35

ඔබ ක්‍රියාකාරකමකින් ඉවත් වූ පසු සංවාදයක් පෙන්වීමට උත්සාහ කිරීමේදී මෙම ගැටළුව පැන නගී.

පහත කේතය ලිවීමෙන් මම මෙම ගැටළුව විසඳා ගත්තෙමි:

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

මූලික වශයෙන්, ඔබ ප්‍රගති ඩයලොග් ආරම්භ කළේ කුමන පන්තියේ සිටද, ඩෙස්ට්‍රෝයි ක්‍රමය ඉක්මවා ගොස් මේ ආකාරයට කරන්න. එය "ක්‍රියාකාරකම් කවුළුව කාන්දු වී ඇත" ගැටළුව විසඳීය.


onDestroy කැඳවීමට සහතික නැත. එම කේතය onPause හෝ onStop තුළට දැමීම වඩා හොඳය
-Pani

19

මම මෑතකදී එම ගැටලුවටම මුහුණ දුන්නා.

මෙම ගැටලුවට හේතුව සංවාදය බැහැර කිරීමට පෙර ක්‍රියාකාරකම් වසා දැමීමයි. ඉහත සිදුවීමට විවිධ හේතු තිබේ. ඉහත ලිපිවල සඳහන් කර ඇති ඒවා ද නිවැරදි ය.

මම තත්වයකට පැටලුණෙමි, මන්ද ත්‍රෙඩ් එකේ මම ව්‍යතිරේකයක් විසි කරන ශ්‍රිතයක් කැඳවූ නිසාය. කවුළුව විසන්ධි වූයේ ඒ නිසා ය.


17

ක්‍රියාකාරකම් විනාශ වූ විට දෙබස් ඉවත් කරන්න

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

pDialog ශුන්‍ය නම් ඔබ ශුන්‍ය සංවාදයේ තත්වය විමසන විට මෙය දෝෂයක් ඇති කරයි
ජොනතන් ඩන්

1
නැත එය ජෝන් ඩන් නොවනු ඇත, මන්ද පළමු එක අසත්‍ය නම් ජාවා දෙවන බූලියන්
සැකසෙන්නේ නැත

15

මෙය උදව් විය හැකිය.

if (! isFinishing()) {

    dialog.show();

    }

2
සමාන පිළිතුරු සිය ගණනක් අතර කවුළු තිබේදැයි පරීක්ෂා කරන්නේ කෙසේදැයි පෙන්වන කිසිවෙක් නැත. ඒ නිසා ඔබ එය කිරීමට මාර්ගය සොයා ගැනීමට යම් කාලයක් ඉතිරි කරයි. ස්තූතියි.
kolyaseg

11

මට එකම අපැහැදිලි දෝෂ පණිවිඩයක් තිබූ අතර ඒ මන්දැයි මා නොදැන සිටියෙමි. පෙර පිළිතුරු වලින් හෝඩුවාවන් ලබා දී, මම මගේ GUI නොවන ඇමතුම් mDialog.finish () ලෙස mDialog.dismiss () ලෙස වෙනස් කළ අතර දෝෂ අතුරුදහන් විය. මෙය මගේ විජට්ගේ හැසිරීමට බලපාන්නේ නැත, නමුත් එය විසන්ධි වූ අතර වැදගත් මතක කාන්දුවක් සලකුණු කිරීමට ඉඩ තිබුණි.


මම () ඇමතුමට පෙර mDialog.hide () කරන බව දුටුවෙමි. එය mDialog.dismiss () ලෙස වෙනස් කිරීම උපක්‍රමය කළේය.
mays

11

මම මෙම ල logs ු-සටහන් මගේ වීඩියෝ ප්ලේයර් යෙදුමට ලබා ගනිමින් සිටියෙමි. වීඩියෝ ප්ලේයරය වසා තිබියදී මෙම පණිවිඩ විසි කරන ලදි. සිත්ගන්නා කරුණ නම්, මම මෙම ල logs ු-සටහන් කිහිප වතාවක් වරක් අහඹු ලෙස ලබා ගැනීමට පුරුදුව සිටියෙමි. මගේ අයදුම්පත කිසිවකට සම්බන්ධ නොවේ 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" ලොග් දෝෂ ගැටළුව විසඳා ගත හැකිය .


මමත් එකම ගැටලුවකට මුහුණ දෙමි. මම ඔබේ කේත රේඛා මගේ කේතයට එක් කළ නමුත් එය ක්‍රියාත්මක නොවූ අතර "android.view.WindowLeaked මුලින් එකතු කරන ලද" දෝෂය ලබා දෙන අතර වීඩියෝව වාදනය නොකොට "වීඩියෝව වාදනය කළ නොහැක"
User42590

10

මට එකම ගැටලුවක් ඇති අතර මෙම පිටුව හමු වූ අතර මගේ තත්වය වෙනස් වූ අතර මම ඇමතුවේ finishaif එය අනතුරු ඇඟවීමේ කොටුව අර්ථ පෙර බ්ලොක් ඇමතුවෙමි.

එබැවින්, ඇමතීම ක්‍රියා dismissනොකරනු ඇත (එය තවම සාදා නොමැති බැවින්) නමුත් ඇලෙක්ස් වොලොවෝයිගේ පිළිතුර කියවා එය වටහාගත් පසු එය අනතුරු ඇඟවීමේ පෙට්ටිය බව වටහා ගත්තේය. ඒ ඇතුළත අවසන් වූ වහාම ආපසු ප්‍රකාශයක් එක් කිරීමට මම උත්සාහ කළෙමිif කොටස .

මම හිතුවේ ඔබ අවසන් වූ පසු එය සියල්ල නවතා එතැනම අවසන් කළ නමුත් එය එසේ නොවේ. එය අවසන් වී ඇති කේත වාරණයේ අවසානයට යන බව පෙනේ.

එබැවින්, යම් කේතයක් කිරීමට පෙර සමහර විට එය අවසන් වන තත්වයක් ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය නම්, ඔබ අවසන් වූ වහාම ආපසු ප්‍රකාශයක් ඉදිරිපත් කළ යුතුය, නැතහොත් එය දිගටම කරගෙන යනු ඇත. කේත වාරණය ඔබ එය හැඳින්වූ ස්ථානයට නොවේ. ඒ නිසා තමයි මට ඒ අමුතු වැරදි ලැබුණේ.

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"

onPause () ක්‍රියාත්මක කිරීමෙන් පසු ක්‍රියාකාරීත්වයේ සන්දර්භය නැති වී යයි. ඒ නිසා දැක්ම ගේ භාවිතා කරන සියලුම මෙම සන්දර්භය මෙම දෝෂය දෙන්න පුළුවන්.


ඔබ සඳහා ඒ හා සමාන දෙයක් කල හැකි අයුරක් progessdialog.show().. සහ progressdialog.hide()දී asynctaskවෙනුවට එම ක්රියාකාරකම් onPause()සිට activity?? මගේ ගැටලුව දෙස බලන්න ... stackoverflow.com/questions/39332880/…
Bhuro

1
එය මා වෙනුවෙන් පරිපූර්ණව ක්‍රියා කරයි: android: noHistory = "true"
ෂොහෙල් රානා

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();
                }
            }

6

ඔබට ඇලර්ට් ඩයලොග් සේවයෙන් ඉවත් කිරීමට අවශ්‍ය නමුත් එය ක්‍රියාකාරකම් තුළ සඳහනක් තබා ගැනීමට අවශ්‍ය නොවන විට මෙන්න විසඳුමකි .

විසඳුම සඳහා ඔබේ ව්‍යාපෘතිය තුළ androidx.lifecycle යැපීම අවශ්‍ය වේ (අදහස් දැක්වීමේ මොහොතේ එය පොදු අවශ්‍යතාවයක් බව මම විශ්වාස කරමි)

සංවාදයෙන් බැහැරවීම බාහිර වස්තුවට (නිරීක්ෂකයාට) පැවරීමට මෙය ඔබට ඉඩ සලසයි, තවද ක්‍රියාකාරකම් මිය ගිය විට එය ස්වයංක්‍රීයව දායකත්වයෙන් ඉවත් වී ඇති නිසා ඔබට තවදුරටත් ඒ ගැන සැලකිලිමත් වීමට අවශ්‍ය නැත. (මෙන්න සාක්ෂි: https://github.com/googlecodelabs/android-lifecycles/issues/5 ).

එබැවින්, නිරීක්‍ෂකයා යොමු කිරීම සංවාදයට තබා ඇති අතර ක්‍රියාකාරකම් නිරීක්‍ෂකයා වෙත යොමු කරයි. "onPause" සිදු වූ විට - නිරීක්ෂකයා සංවාදය බැහැර කරයි, සහ "onDestroy" සිදු වූ විට - ක්‍රියාකාරකම නිරීක්‍ෂකයා ඉවත් කරයි, එබැවින් කිසිදු කාන්දුවක් සිදු නොවේ (හොඳයි, අවම වශයෙන් ලොග් කැට් වල දෝෂයක් මා දකින්නේ නැත)

// 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()
}

5

ProgressDialog තවමත් පෙන්වන විට මම ක්‍රියාකාරකමක් අවසන් කළ ස්ථානය තිබේ නම්.

එබැවින් පළමුව ඩයලොග් සඟවා ක්‍රියාකාරකම අවසන් කරන්න.


5

මෙම කේතය උත්සාහ කරන්න:

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

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

}

progressdialog.dismiss();මෙය NullPointerException නිර්මාණය කළ හැකිය.
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.

ඔබට විකල්ප දෙකක් තිබේ AFAIK:

  1. ඔබගේ සීරුවෙන් පිවිසුම් නැවත සිතා: ඇමතුමක් dismiss()මත dialogපෙර ඇත්තටම ඔබේ ක්රියාකාරකම් පිටවීමට.
  2. මෙම දාන්න dialogවෙනස් නූල් හා ඒ මත ධාවනය thread(දැනට පවතින ස්වාධීන activity).

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වස්තුව සෑදිය යුතු අතර ඔබ එය ක්‍රමයෙන් කළ යුතුය .onPreExecuteAsyncTaskdismissonPostExecute


4

හොඳම විසඳුම වන්නේ ව්‍යතිරේකයක් සිදු වූ විට දෙබස් එක් කර උත්සාහයෙන් අල්ලා ගැනීම සහ බැහැර කිරීම පමණි

පහත කේතය භාවිතා කරන්න

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

3
අවසන් වූ පසු සංවාදය අහෝසි නොවේ dialog.dismiss()
?,

3

මගේ නඩුවේදී, හේතුව වූයේ ඇන්ඩ්‍රොයිඩ් මැනිෆෙස්ට් ගොනුවට අවසරයක් ඇතුළත් කිරීමට මට අමතක වීමයි.

මම දැනගත්තේ කෙසේද? හොඳයි, පිළිගත් පිළිතුරට පහළින් අදහස් දැක්වීමේදී බොබී පවසන ආකාරයටම, ඔබේ ල logs ු-සටහන් වෙත තවදුරටත් අනුචලනය කරන්න, එවිට ව්‍යතිරේකය සැබවින්ම විසි කළ පළමු හේතුව හෝ සිද්ධිය ඔබට පෙනෙනු ඇත. පෙනෙන විදිහට, "ක්‍රියාකාරකම මුලින් එකතු කළ කවුළුව කාන්දු වී ඇත" යන පණිවිඩය පළමු ව්‍යතිරේකය කුමක් වුවත් එහි ප්‍රති ulted ලයක් වන ව්‍යතිරේකයකි.


3

පහත කේතය උත්සාහ කරන්න, ඔබ ප්‍රගති සංවාදය බැහැර කරන ඕනෑම වේලාවක එය ක්‍රියාත්මක වන අතර එහි උදාහරණය තිබේද නැද්ද යන්න එය දකිනු ඇත.

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

}

මෙය මට වැඩ කරන්නේ නැත. එච්ටීටීපී ඇමතුමෙන් ප්‍රතිචාර ලැබීමෙන් පසු මට ඩයලොග්.ෂෝ () ඇති අතර මේ අතරතුර මම තිරය භ්‍රමණය කරන විට ක්‍රියාකාරකම වෙන්වී ඇති නමුත් එය ඩයලොග්.ෂෝ () ට පෙර ෂෝන් == සත්‍ය බව පෙනේ, පසුව මෙම චෙක්පත තිබියදීත් ඩයලොග් බිඳ වැටේ
මයිකල් සියොබ්‍රෝ

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;
  }

AFAIC, මෙය වඩාත් සුදුසුය, මන්ද ඔබ සාමාජිකයෙකු ලෙස ප්‍රගති සංවාදය පැවැත්විය යුතු නැති නිසා, වෙඩි තබා (පෙන්වන්න) අමතක කරන්න

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.