2017-04-03 1 views
2

Ich habe Suchfeld in meiner Seite, ich habe onTextChangeListener() auch hinzugefügt. Wenn ich Buchstaben/Zeichen aus dem Suchfeld hinzufüge/entferne, wird jedes Mal, wenn ich denselben Aufruf asyntask.Supple 3 mal aufgerufen, dann 3 mal Fortschritt Dialog-Instanzen erstellt und muss entlassen.Hier Fortschritt Dialog wird nicht entlassen.Fortschrittsdialog in asyntask

search.addTextChangedListener(new TextWatcher() { 
      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 
      @Override 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       searchresult = search.getText().toString(); 

       if (count == 0) { 
        pageCount = 1; 
        productsList.clear(); 
        mCount = 0; 
        if (isTextWatcherVisible) { 
//      GetProductsTask(); 
         new GetProductsTask().execute(); 
        } 
       } 
      } 
      @Override 
      public void afterTextChanged(Editable s) { 
      } 
     }); 
class GetProductsTask extends AsyncTask<Void, Void, Void> { 

    final String pcid = Preferences.getString(Preferences.PrefType.enum_company_id, getActivity()); 

    String url1 = getContext().getString(R.string.url) + "products?company_id=" + pcid + "&page=" + pageCount; 

    public GetProductsTask() { 
     progressDialog = new ProgressDialog(getActivity()); 
     progressDialog.setMessage("Loading..."); 
     progressDialog.setIndeterminate(false); 
     progressDialog.setCancelable(false); 
    } 
    protected void onPreExecute() { 
     super.onPreExecute(); 
//    progressDialog = new ProgressDialog(getActivity()); 
//    progressDialog.setMessage("Loading..."); 
//    progressDialog.setIndeterminate(false); 
//    progressDialog.setCancelable(false); 
     progressDialog.show(); 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // somthig here 
    } 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     ProductslistAdapter adapter = new ProductslistAdapter(getActivity(), R.layout.vendor_products_item, productsList, searchresult); 

     list.setAdapter(adapter); 
     int count = pageCount - 1; 
     list.setSelection(count * 24); 
     if (progressDialog.isShowing()) 
      progressDialog.dismiss(); 

    } 

Antwort

2
// here your everytime your creating the dialog box, loosing previous reference. And "progressDialog " is not local to class "GetProductsTask".  
    progressDialog = new ProgressDialog(getActivity()); 
    progressDialog.setMessage("Loading..."); 
    progressDialog.setIndeterminate(false); 
    progressDialog.setCancelable(false); 

Lösung:

class GetProductsTask extends AsyncTask<Void, Void, Void> { 
//make it local to class 
ProgressDialog progressDialog; 
+0

Kannst du es bitte upvote – Sush

1

schaffen nur eine Methode wie:

private static ProgressDialog progressDialog; 

public static void showProgressDialog(Context context) { 

     if (progressDialog == null) { 
      progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setMessage("Loading..."); 
      progressDialog.setIndeterminate(false); 
      progressDialog.setCancelable(false); 
      progressDialog.show(); 
     } 

} 

Anruf showProgressDialog Methode in OnPreExecute().

Dialogfeld schließen:

if(progressdailog.isShowing()){ 
    progressdialog.dismiss(); 
} 
+1

Es wäre schön, zu erklären, warum dieser Code funktioniert und was das SO Problem mit seinem Code. – danypata

+0

@danypata ** if (progressDialog == null) ** hier überprüfen wir, ob eine Instanz für den Fortschrittsdialog läuft oder nicht. Wenn der Dialog bereits ausgeführt wird, wurde keine neue Dialoginstanz erstellt. Auf diese Weise wird immer nur eine Instanz ausgeführt. –

-1

Verwenden Sie dieses, wo Sie Dialog schließen möchten.

ProgressDialog pDialog = new ProgressDialog(this); 
pDialog.dismiss(); 
0

In Ihrer AsynchTaskonPreExecute() Methode erste Prüfung für den Fortschritt Dialog, wenn er es null dann initialisieren und zeigen ist.

protected void onPreExecute() { 
     super.onPreExecute(); 
     if (progressDialog == null) { 
      progressDialog = new ProgressDialog(getActivity()); 
      progressDialog.setMessage("Loading..."); 
      progressDialog.setIndeterminate(false); 
      progressDialog.setCancelable(false); 
      progressDialog.show(); 
     } 
    } 

Und in onPostExecute() Methode nur sie entlassen.

protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     // Your other code goes here 
     if(progressDialog != null && progressDialog.isShowing()) { 
       progressDialog.dismiss(); 
       progressDialog = null; 
     } 
     } 
0

Diese Ursache für dieses Problem ist:

new GetProductsTask().execute(); 

Diese Anweisung neue Task erstellt jedes Mal, wenn Sie Zeichen eingeben. Daher müssen Sie nach dem Abbrechen des aktuellen Vorgangs eine neue Aufgabe erstellen.

public class MainActivity extends Activity { 
    GetProductsTask getProductsTask = null; 
    ProgressDialog ProgressDialog = null; 


    public void onTextChanged(CharSequence s, int start, int before, int count) { 
     //Replace this: new GetProductsTask().execute(); 
     if(getProductsTask != null) { 
      getProductsTask.cancel(); 
      getProductsTask = null; 
     } 

     getProductsTask = new GetProductsTask(); 
     getProductsTask.execute(); 
    } 

    class GetProductsTask extends AsyncTask<Void, Void, Void> { 
     //Add new method inside it 
     public void onCancelled (Result result) { 
      //Got call when task is cancelled 
     } 
    } 
} 

Ich hoffe, es funktioniert für Sie.

+0

Er kann den Dialog nicht löschen, sobald er erstellt wird, wenn Sie 'setCancelable (false) sehen;' so muss er auf das Ergebnis warten und nach dem wird es abgewiesen. –

+0

'setCancelable (false);' bedeutet Legt fest, ob dieser Dialog mit der BACK-Taste abgebrochen werden kann. Bitte besuchen Sie hier: https://developer.android.com/reference/android/app/Dialog.html#setCancelable(boolean) –

0

aktualisieren AsyncTask wie folgt:

class GetProductsTask extends AsyncTask<Void, Void, Void> { 

    final String pcid = Preferences.getString(Preferences.PrefType.enum_company_id, getActivity()); 
    String url1 = getContext().getString(R.string.url) + "products?company_id=" + pcid + "&page=" + pageCount; 

    ProgressDialog progressDialog; 

    public GetProductsTask() { 
     progressDialog = new ProgressDialog(getActivity()); 
    } 

    protected void onPreExecute() { 

     progressDialog.setMessage("Loading..."); 
     progressDialog.setIndeterminate(false); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     // somthig here 

     return null; 
    } 

    protected void onPostExecute(Void result) { 

     ProductslistAdapter adapter = new ProductslistAdapter(getActivity(), R.layout.vendor_products_item, productsList, searchresult); 
     list.setAdapter(adapter); 

     int count = pageCount - 1; 
     list.setSelection(count * 24); 

     if (progressDialog.isShowing()) 
      progressDialog.dismiss(); 
    } 
} 
Verwandte Themen