2017-10-05 2 views
-3

Es gibt ähnliche Fragen wie diese, aber es hat mein Problem nicht gelöst. Meine on post execute läuft vor doInBackground, ich denke ich mache keine Arbeit in doInBackground, aber immer noch auf post execute läuft vor doInBackground.Below ist mein Code.DoInBackground wird nach der Ausführung aufgerufen

sumbit.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String mail = resMail.getText().toString(); 
      String id = resUniq.getText().toString(); 

      new Reset_Pass_Task().execute(); 

     } 
    }); 
} 

private class Reset_Pass_Task extends AsyncTask<Void,Void,Void> { 
    @Override 
    protected Void doInBackground(Void... params) { 

     try{ 
      ParseQuery<ParseUser> query = ParseUser.getQuery(); 
      query.whereEqualTo("username", "[email protected]"); 
      query.findInBackground(new FindCallback<ParseUser>() { 
       @Override 
       public void done(List<ParseUser> objects, ParseException e) { 

        if (e==null){ 

         for(ParseUser singleobject:objects){ 
          name23 = (String) singleobject.get("uniqueId"); 

         } 
        }else { 
         Log.i("abc",e.toString()); 
        } 
       } 
      }); 
     } catch (Exception e){ 
      Log.i("xys",e.toString()); 
     } 



     return null; 
    } 

    @Override 
    protected void onPostExecute(Void aVoid) { 

     if (name23!=null){ 
      Log.i("def",name23); 
     }else { 
      Log.i("ijk","null"); 
     } 

    } 
} 
+4

es ist ziemlich offensichtlich, dass query.findInBackground asynchron ist und somit Rückkehr. null wird ausgeführt, bevor die Abfrage abgeschlossen ist –

+0

so irgendwelche Vorschläge, ich glaube nicht, dass es Null zurückgibt und geben meine Ergebnisse im nächsten Versuch –

+0

, also sollte ich doIn Hintergrund nicht verwenden? –

Antwort

2

in doInBackground Sie bereits in einem TaskThread sind. Wenn Sie Zugriff auf eine Synchronisierungsmethode für ** findInBackground ** haben, rufen Sie sie dort an. Andernfalls entfernen Sie einfach die AsyncTask vollständig, da der Aufruf findInBackground bereits asynchron ist.

Hier ist Ihr Problem, dass für das doInBackground, das einzige, was "sichtbar" dafür ist, dass Sie eine Funktion starten, die automatisch zurückkehrt. Es wartet nicht darauf, dass der Async-Aufruf abgeschlossen ist.

Vorgeschlagene fix:

private void resetPassword() { 
try{ 
      ParseQuery<ParseUser> query = ParseUser.getQuery(); 
      query.whereEqualTo("username", "[email protected]"); 
      query.findInBackground(new FindCallback<ParseUser>() { 
       @Override 
       public void done(List<ParseUser> objects, ParseException e) { 

        if (e==null){ 

         for(ParseUser singleobject:objects){ 
          name23 = (String) singleobject.get("uniqueId"); 

         } 
        }else { 
         Log.i("abc",e.toString()); 
        } 
       } 
      }); 
     } catch (Exception e){ 
      Log.i("xys",e.toString()); 
     } 
} 

Und rufen Sie einfach resetPasswordAsync() statt neuen Reset_Pass_Task() execute()

+1

Ich bin mir nicht sicher, ob 'done (...)' auf dem Haupt-Thread ausgeführt wird, also solltest du 'runOnUIThread' hinzufügen 'done (...)' – JohnnyAW

+0

Guter Punkt @JohnnyAW, jedoch macht die gesamte done() -Methode bisher keinen Sinn, überschreibt eine Variable und macht nichts anderes damit. Aber du hast Recht, wenn es etwas wie "hol den neuen Text und zeige es in einem TextView", sollte OP sicherstellen, dass ** done() ** läuft ist zurück auf dem UIThread, sonst rufen Sie ** runOnUIThread() * * – NSimon

+1

es funktioniert gut. Danke vielmals. –

Verwandte Themen