2017-11-18 1 views
0

Ich verwende asynchrone Aufgabe, um Daten aus meiner Datenbank zu erhalten. ich habe:Ergebnis von Async-Task in Nicht-Aktivitätsklasse

public class BackgroundDatabaseTask extends AsyncTask<String, Void, String> { 
    String jsonData; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... values) { 
     String jsonData = Driver.returnJsonDataFromDatabase(values[0]); 
     return jsonData; 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     jsonData = result; 
    } 
} 

Und in anderer Klasse verwende ich es mag:

private static String returnJsonDataBackgroundTaskExecute(String fromWhichTableGetData) { 

    try { 
     return new BackgroundDatabaseTask().execute(fromWhichTableGetData).get(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     e.printStackTrace(); 
    } 

    return "Error in BackgroundDatabaseTask"; 
} 

Aber get() meinen Haupt-Thread zu blockieren. Also, wie kann ich Ergebnis meiner asynchronen Aufgabe in anderen Nicht-Aktivitätsklassen erhalten? Ich möchte dies in Nicht-Aktivität-Klasse ausführen, so meine Klasse OnCreate-Methode nicht, aber ich habe Aktivität von meiner MainActivity-Klasse.

UPDATE: Jetzt löse ich dieses Problem mit Thread, aber es ist eine gute Lösung?

Runnable runnable = new Runnable() { 
     @Override 
     public void run() { 
      listOfDataFromDatabase = GetterDataFromDatabase.returnJsonDataBackgroundTaskExecute(tableNameFromWhichIGetData); 
     } 
    }; 
    Thread thread = new Thread(runnable); 
    thread.start(); 
    try { 
     thread.join(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 

jetzt habe ich Zugang zu diesem varaible listOfDataFromDatabase in anderen Verfahren.

Antwort

0

Ihre Worte sind nicht akzeptabel für AsyncTask !!!

AsyncTask verwendet wird, wo Sie eine Menge Arbeit auf Haupt ui nicht tun wollen (Internet-Basis-Aktivitäten) aber Sie sagen, dass diese Aktion blockiert Ihre Hauptthread !!!

Ich denke, dein Problem ist woanders in deinem code.even wenn deine AsyncTask bei ihrem Job fehlgeschlagen ist, aber niemals abstürzt oder dein Haupt-UI blockiert.

und auch bei Verwendung .get(); Sie sagen eigentlich Haupt-Thread seine Arbeit stoppen, bis AsyncTask seinen Job beendet ist, so gibt es vielleicht zwei Fehler

1- zu viel Arbeit auf Hauptthread weil AsyncTask Job beendet nie

2- zu viel Arbeit auf Hauptthread weil asynctask job ein langer Prozess ist.

statt get() Nutzung dieser Fähigkeit:

@Override 
protected void onPostExecute(String result) { 
     jsonData = result; 
    } 
+0

„Ich denke, das Problem ist, wo einige sonst in deinem Code "Wie du später sagst, ist das Problem mit dem Aufruf von' get() ', der den Haupt-Thread blockiert, bis die AsyncTask beendet ist. –

+0

sollten Sie das nicht tun, obwohl es für Entwickler vorgesehen ist, das zu verwenden, aber wir werden eine parallele Aufgabe verwenden, um Jobs schneller auszuführen, da wir get() nicht verwenden können. –

0

Ein AsyncTask erstellt einen neuen Thread eine Aufgabe zu erfüllen, die eine lange Zeit in Anspruch nimmt. Sie starten diesen Thread, indem Sie execute() aufrufen. Sie rufen jedoch sofort get(), die auf die Beendigung der Aufgabe wartet. Dies zerstört den ganzen Sinn der Verwendung einer AsyncTask in erster Linie vollständig.

Stattdessen sollten Sie den Anruf zu get() entfernen und die endgültige Verarbeitung in onPostExecute() durchführen. Sie können mit dieser Methode machen, was Sie wollen. Es ist absolut nicht erforderlich, dass Sie die Aktivität in irgendeiner Weise verwenden. Sie können anderen Klassen Daten zur Verfügung stellen, wenn Sie das wünschen.

+0

Sie haben gesagt: "Sie können anderen Klassen Daten zur Verfügung stellen, wenn Sie das wünschen." Wie kann ich von onPostExecute Daten an andere nicht neue Aktivitätsklassen liefern? – grap

+0

Was meinen Sie mit "nicht neue Aktivitätsklasse"? Was möchten Sie mit den Daten machen? –

0

Sie können eine Schnittstelle in Ihrem AsyncTask Klasse definieren dann implementieren, wo immer Sie wollen und das Ergebnis aus dieser Schnittstelle Rückruf erhalten

MyTask extends AsynTask{ 
public interface DataListener{ 
void onDataReceived(String result); 
} 
/// then on your onPostExecute method , get an instance of the interface then push the result to the interface method 
dataListener.onDataReceived(result); 
} 

vielleicht wird dies dazu beitragen

Verwandte Themen