-1

ich AsyncTask verwende, so dass die Funktion Ich möchte sofort ausgeführt und wartet nicht, bis zum Ende ausgeführt werden ..AsyncTask führt am Ende der Funktion

aber aus irgendeinem Grund ich nicht, warum es führt am Ende aller Prozesse!

schaute ich auf anderen Lösungen und festgestellt, ist das Thema am Ende ausgeführt werden, aber für AsyncTask sollte ausgeführt werden, wenn es aufgerufen wird ..

hier mein Code

private void LogMeIn() 
{ 

     string CheckValue; 

     // Here I call the AsyncTask 

     new GCM().execute(null,null,null); 

     //gcmRegID is a public variable and should has GCM value assigned to it by now, but I it is empty as GCM() has not been executed yet 

      //This is always return empty string 
      CheckValue = gcmRegID; 
} 

Das ist das ist AsyncTask, die bis zum Ende warten, wird

ausgeführt
//This is the AsyncTask 
private class GCM extends AsyncTask<String, String, String> { 

     private String resp; 
     private Context context; 



     @Override 
     protected String doInBackground(String... params) { 
      GCMHelper gcmRegistrationHelper = new GCMHelper (
        getApplicationContext()); 

      try { 
       gcmRegID = gcmRegistrationHelper.GCMRegister("123456789"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      return gcmRegID; 
     } 


} 

ich habe versucht, den Ruf nach GCMRegister in OnPreExecute zu setzen, aber ich erhalte eine Fehlermeldung, dass es in der Haupt sein muss Gewinde

es ist, wie ich in Kreisen werde ....

der Anruf im Hauptthread zu sein hat und der Haupt-Thread wird am Ende der Funktion ausgeführt werden ...

Es ist wie keine Möglichkeit, den GCM-Code in die Mitte zu bekommen !!!!

Wie kann ich diese AsyncTask ausführen, wenn es aufgerufen wird?

Dank

+0

Es wird sofort ausgeführt. Aber du tust nichts damit. Sollte sich die Dokumentation genauer ansehen. –

+3

"gcmRegID ist eine öffentliche Variable und sollte ihm jetzt GCM-Wert zugewiesen haben" - Nein, sollte es nicht, weil Ihre Aufgabe asynchron ausgeführt wird, was bedeutet, dass sie nicht blockiert, und die Zeilen nach dem 'execute() 'rufe sofort weiter. –

+0

Wo rufst du 'LogMeIn()'? Verwenden Sie Breakpoints. – petey

Antwort

2

Ohne mehr des Codes zu sehen, es ist schwer für mich zu sagen, aber ich würde einen Blick darauf werfen, wo Sie LogMeIn sind() aufrufen. Da Ihre AsyncTask und der auszuführende Aufruf in der Funktion LogMeIn() verschachtelt sind, wird sie erst aufgerufen, wenn LogMeIn() zuerst aufgerufen wird.

AsyncTask geht durch die folgenden vier Schritte, um nach dem Ausführen() aufrufen:

  • OnPreExecute()
  • doInBackground (Params ...)
  • onProgressUpdate (Progress ...)
  • onPostExecute (Ergebnis)

Diese können zu Ihrer GCM-Klasse hinzugefügt und verwendet werden, wie Sie möchten. Beachten Sie, dass Sie sie nicht direkt anrufen. AsyncTask führt dies automatisch nach dem Aufruf von .execute() aus.

Nur die in doInBackground (Params ...) angegebenen Aufgaben werden auf einem Hintergrundthread ausgeführt. Der Rest ist alles auf dem UI (oder Haupt) -Thread. Ich würde vorschlagen, entweder einen Toast oder ein Log innerhalb onPreExecute() und in onPostExecute() zu debuggen wo/wann GCM(). Execute aufgerufen wird und dann zu sagen, wenn die Hintergrundaufgabe abgeschlossen ist. Dadurch erhalten Sie eine bessere Vorstellung davon, was vor sich geht.

Stellen Sie sicher, dass Sie nicht versuchen, die Benutzeroberfläche in doInBackground() zu aktualisieren.

Würde gerne mehr helfen, aber wir müssten mehr von Ihrem Code sehen.

@Override 
public void onPreExecute() { 
    super.onPreExecute(); 

    Log.d("GCM", "onPreExecute: called"); 
} 

@Override 
public void onPostExecute(String resultOfDoInBackground) { 
    super.onPostExecute(resultOfDoInBackground); 

    Log.d("GCM", "onPostExecute: called"); 
} 
+0

Ich habe versucht, den Aufruf für GCMRegister in OnPreExecute zu setzen, aber ich bekomme einen Fehler, dass es im Hauptthread sein muss es ist wie ich in Kreisen gehe .... der Anruf muss im Hauptthread sein und der Haupt-Thread wird am Ende der Funktion ausgeführt werden ... es ist wie keine Möglichkeit, den GCM-Code in die Mitte zu bekommen !!!! – asmgx

+1

In Ordnung, ich denke, ich habe herausgefunden, was Sie zu tun versuchen. Sie versuchen, den Wert von gcmRegId auf den Rückgabewert des doinBackground der AsyncTask zu setzen, richtig? –

+0

Ich möchte den GCM-Code abrufen und in der öffentlichen Variable gcmRegID festlegen – asmgx

1

Try this -

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    new GCM().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,params); 
} else { 
    new GCM().execute(); 
} 
1

Versuchen Sie Ihr neues GCM().execute(null,null,null); im geschützten Hohlraum onCreate(Bundle savedInstanceState) Methode platzieren. Auf diese Weise wird es aufgerufen, sobald die App ausgeführt wird. Auf diese Weise haben Sie Ihre GCM ID, bevor Sie an die LogMEIn Methode gelangen.

1

AsyncTask führt eine Warteschlange von Aufgaben und einen Thread-Pool, der Thread-Pool führt die Aufgaben nacheinander aus. Wenn Sie also zu viele Aufgaben haben, werden Sie Ihre Aufgaben nicht sofort ausführen.

Und in einem Prozess teilen alle Ihre AsyncTask einen Thread-Pool. In diesem Fall sollten Sie eine Aufgabenwarteschlange selbst erstellen, Sie können einfach HandleThread verwenden, um eine zeitnahe Aufgabe auszuführen.