2016-05-16 22 views
1

Ich implementiere gerade meinen eigenen benutzerdefinierten Fortschrittsdialog, in dem ich show and hide anrufe, sobald ein Ergebnis eintrifft/ein Fehler auftritt. Ich möchte jedoch eine benutzerdefinierte Methode implementieren, die sagt, wenn der Fortschrittsdialog nicht nach 10 Sekunden, egal was versteckt wurde, ausblenden und eine Warnung ausgeben.Wie versteckt man ein benutzerdefiniertes Ladesymbol nach einer bestimmten Zeit (Android)?

Dies ist meine benutzerdefinierte Fortschrittsdialog mit meiner Methode, die funktioniert, aber nicht vollständig.

public class CustomProgressDialog extends ProgressDialog { 

    private AnimationDrawable animation; 
    private CountDownTimer cTimer = null; 
    private Context mContext; 
    public CustomProgressDialog(Context context) { 
     super(context); 
     mContext = context; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.custom_progress_dialog); 


     ImageView la = (ImageView) findViewById(R.id.animation); 
     la.setBackgroundResource(R.drawable.custom_progress_dialog_animation); 
     animation = (AnimationDrawable) la.getBackground(); 

    } 

    @Override 
    public void show() { 
     super.show(); 
     animation.start(); 
     startTimer(); 
    } 

    @Override 
    public void dismiss() { 
     super.dismiss(); 
     animation.stop(); 
     if(cTimer != null) { 
      cTimer.cancel(); 
     } 
    } 

    //timer added just in case progress dialog does not stop on its own 
    private void startTimer() { 
     cTimer = new CountDownTimer(10000, 1000) { 

      public void onTick(long millisUntilFinished) { 
      } 

      public void onFinish() { 
       dismiss(); 
       AlertDialogManager alert = new AlertDialogManager(); 
       alert.showAlertDialog(mContext, mContext.getString(R.string.loadingErr), mContext.getString(R.string.loadingErrTxt), 3); 
      } 
     }.start(); 
    } 

    @Override 
    public void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     animation.stop(); 
     cTimer.cancel(); 
    } 
} 

Dies ist, wie ich es in der Tätigkeit/Fragmente implementieren:

private void showProgressDialog() { 
     customProgressDialog = new CustomProgressDialog(this); 
     customProgressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
     customProgressDialog.show(); 
     //so it cannot be closed by user first one lets back button cancel it 
     //customProgressDialog.setCanceledOnTouchOutside(false); 
     customProgressDialog.setCancelable(false); 

    } 

    private void hideProgressDialog() { 
     if(customProgressDialog != null) { 

      //customProgressDialog.hide(); 
     } 
    } 

UPDATE: Dies ist eine zweite Option, die ich versuchte, noch die Warnung nicht aus Aufspringen nicht aufhören, die mich macht denke, der timer läuft noch immer auf abbrechen.

Dies ist die Aktivität:

private void autoProgressShutdown() { 
     Runnable progressRunnable = new Runnable() { 

      @Override 
      public void run() { 
       customProgressDialog.cancel(); 
       callAlert(); 
       } 
     }; 

     Handler pdCanceller = new Handler(); 
     pdCanceller.postDelayed(progressRunnable, 10000); 
    } 

    private void callAlert() { 
     AlertDialogManager alert = new AlertDialogManager(); 
     alert.showAlertDialog(this, getString(R.string.loadingErr), getString(R.string.loadingErrTxt), 3); 

    } 


    private void showProgressDialog() { 
     customProgressDialog = new CustomProgressDialog(this); 
     customProgressDialog.getWindow().setBackgroundDrawable(new ColorDrawable(android.graphics.Color.TRANSPARENT)); 
     customProgressDialog.show(); 
     //so it cannot be closed by user first one lets back button cancel it 
     //customProgressDialog.setCanceledOnTouchOutside(false); 
     customProgressDialog.setCancelable(false); 
     autoProgressShutdown(); 

    } 

    private void hideProgressDialog() { 
     customProgressDialog.cancel(); 
     if(customProgressDialog != null) { 

      customProgressDialog.hide(); 
     } 
    } 

Im benutzerdefinierten Dialog bearbeitet die Datei alle Timer Sachen zu entfernen und hat dieses Bild:

@Override 
    public void setOnCancelListener(OnCancelListener listener) { 
     super.setOnCancelListener(listener); 
     dismiss(); 
    } 

Mögliche Probleme: -nicht sicher, ob Speicherleck Probleme, da ich es nicht zerstöre

Bestimmte Probleme: -wenn der Fortschrittsdialog ausgeblendet wird, erscheint immer noch der Alarm a N ach 10 Sekunden, das bedeutet entweder gar nicht cancel -Auch aufgerufen, wenn ich Bildschirme schalten nicht sicher, die abbrechen, wenn genug ist, um den Timer

Antwort

2

zu zerstören Sie Handler#postDelayed verwenden können, um etwas später zu einem bestimmten Thread passieren, und Sie kann Handler#removeCallbacksAndMessages verwenden, um ausstehende Aufgaben abzubrechen. Wenn Sie es mit null aufrufen, bricht es einfach alles ab, das auf dem Handler aussteht, wenn Sie einige Sachen haben, die Sie in der gesandten Aufgabe verhindern müssen.

Hier ist Ihr Dialog, aber richtig selbstabschließend:

class SuicideDialog extends Dialog{ 
    private Handler mAutoTerminationHandler; 

    @Override 
    public void onShow(){ 
    mAutoTerminationHandler = new Handler(); 
    } 

    @Override 
    public void show(){ 
    super.show(); 
    mAutoTerminationHandler.postDelayed(new Runnable(){ 
     dismiss(); 
    }, 666L); 
    } 

    @Override 
    public void dismiss(){ 
    mAutoTerminationHandler.removeCallbacksAndMessages(null); 
    super.dismiss(); 
    } 
} 

Oder Sie können die Lebensdauer hören in seine eigene Klasse setzen:

class ShownTaskListener implements OnShowListener, OnDismissListener { 
    private Handler mHandler; 

    @Override 
    public ShownTaskListener(Handler handler, Runnable showTask){ 
    mHandler = handler; 
    mShowTask = showTask; 
    } 

    // from OnShowListener 
    @Override 
    public void onShow(){ 
    mHandler.postDelayed(mShowTask, 666L); 
    } 

    // from OnDismissListener 
    @Override 
    public void onDismiss(){ 
    // get rid of all pending actions in the Handler 
    mHandler.removeCallbacksAndMessages(null); 
    } 
} 

Und dann können Sie es selbst verwenden - Entfernen Sie alle Dialog, indem Sie diesen Listener mit Dialog#setOnShowListener und Dialog#setOnDismissListener verbinden.