2016-04-04 14 views
0

Dies ist die Methode, mit der ich Werte abrufe.Geben Sie mehrere Werte aus AsyncTask/doInBackground zurück und verwenden Sie sie in einer anderen Methode

@Override 
    protected Void doInBackground(String... params) { 
     try { 

      Intent intent = getIntent(); 
      String dvlaNumFin = intent.getStringExtra("dvlaNumber"); 

      final TextView outputView = (TextView) findViewById(R.id.showOutput); 
      final URL url = new URL("https://dvlasearch.appspot.com/DvlaSearch?licencePlate="+dvlaNumFin+"&apikey="); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 

      connection.setRequestMethod("GET"); 
      connection.setRequestProperty("USER-AGENT", "Mozilla/5.0"); 
      connection.setRequestProperty("ACCEPT-LANGUAGE", "en-US,en;0.5"); 

      final StringBuilder output = new StringBuilder(String.valueOf(url)); 

      BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream())); 
      String line = ""; 
      StringBuilder responseOutput = new StringBuilder(); 
      System.out.println("output===============" + br); 
      while ((line = br.readLine()) != null) { 
       responseOutput.append(line); 
      } 
      br.close(); 

      HandleJSON obj = new HandleJSON(""); 

      obj.readAndParseJSON(responseOutput.toString()); 

      output.append(System.getProperty("line.separator") + "\n" + System.getProperty("line.separator") + "Make : " + obj.getMake() + "\nModel : " + obj.getModel()); 
      output.append("\nSix Month Rate : " + obj.getSixMonthRate() + "\nTwelve Month Rate : " + obj.getTwelveMonthRate() + "\nDate of First Registration : " + obj.getDateofFirstRegistrationegistration()); 
      output.append("\nYear of Manufacture : " + obj.getYearOfManufacture() + "\nCylinder Capacity : " + obj.getCylinderCapacity() + "\nCO2 Emmissions : " + obj.getCo2Emissions()); 
      output.append("\nVIN number : " + obj.getVin() + "\nTransmission type : " + obj.getTransmission()); 

      DVLAresult.this.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        outputView.setText(output); 
        progress.dismiss(); 

       } 
      }); 

     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 

Ich möchte obj.getMake() verwenden und so weiter, um die Werte von JSON. Aber verstehe nicht, wie es geht, oder gib es zurück. Ich weiß, sollte Rückgabewert sein oder durch Verwendung von final.

+1

Implementieren Sie die onPostExecute-Methode in Ihrer AsyncTask-Klasse :) Wie der Name schon sagt, wird diese aufgerufen, sobald Ihr doInBackground die Ausführung beendet hat. Rufen Sie von onPostExecute die Methode auf, die Sie aufrufen möchten, und übergeben Sie die Antwort, die Sie in onPostExecute als Parameter erhalten haben :) Das ist alles :) –

+0

http://stackoverflow.com/questions/9458258/return-value-from-async-task -in-android –

+2

Mögliches Duplikat von [AsyncTask Android-Beispiel] (http://stackoverflow.com/questions/9671546/asynctask-android-example) –

Antwort

1

FOG

einfach implementieren OnPostExecute in Ihrem AsyncTask Klasse :)

zum Beispiel:

@Override 
protected void onPostExecute(String makeValue) { 
    // remember this method gets called on main thread 
    letsCallFogsMethod(makeValue); //call your method and pass the make value here :) 
} 

Thats it Kumpel :) Nun, wie kommt diese OnPostExecute jeden Wert wird immer ??? Sie müssen zurückkehren es aus doInBackground Methode Geck :)

wie

@Override 
protected String doInBackground(String... params) { 
    //after all bra bla simply say 
    return obj.getMake(); 
} 

Sie jede Änderung Ihrer doInBackground Unterschrift Kumpel bemerken Sie ?? Ja, ich wechselte von Void zu String :)

von String Schreiben Sie darüber informiert, dass, wenn Sie fertig ausgeführt werden doInBackground Sie eine Zeichenfolge zu OnPostExecute zurück :)

Also, wenn ich schreibe, wie es in der Antwort wird es funktioniert ?? Nee. Da Sie Void in Ihrem doInBackground Ihre Async-Task-Signatur etwas aussehen könnte

private class FogsAsyncTask extends AsyncTask<bla,blah,Void> { 

Können Sie die letzte Lücke sehen angegeben haben ??? :) Aber jetzt haben Sie chnaged doInBackground ist es nicht so, wie auch die AsyncTask Signatur-Update :)

private class FogsAsyncTask extends AsyncTask<bla,blah,String> { 

Jetzt sollte es funktionieren :) Glücklich Codierung Kumpel :) Hoffe, meine Antwort Ihnen geholfen :)

+0

new GetClass (this) .execute(); Mit diesem kann ich ausführen und Ergebnis erhalten, aber wie verwende ich nur einzelne Werte? –

+0

Was meinst du damit? Sorry ich bekomme deine Frage richtig, du willst mehr als einen Wert an onPostExecute übergeben ?? Ist es das was du willst??? –

+0

Haupt Idee ist es, Werte separat zu erhalten, dass ich nicht nur vollständige Datenbündel anzeigen. 1) basierend auf diesen Werten möchte ich diese Daten an die Datenbank senden 2) Ich möchte einige dieser Daten als Teil der URL verwenden, wohin der Benutzer weitergeleitet wird. –

0

Sie können die Ausgabe auf OnPostExecute Methode erhalten nur die Methode außer Kraft setzen und die Ausgabe auf sie

0

AsyncTask hat drei (Haupt-) Methoden zu erhalten, onPreExecute, doInBackground und onPostExecute. Nur doInBackGround wird auf einem Hintergrundthread ausgeführt, die anderen beiden werden auf dem UI-Thread ausgeführt. (Es gibt auch onProgressUpdate aber ich werde es hier überspringen)

In Ihrem Fall zurückgeben, was Sie in doInBackground Methode wollen. Dieser Rückgabewert ist der Eingabeparameter für onPostExecute. Dort können Sie jede andere (erreichbare) Methode aufrufen, die Sie möchten. Beachten Sie, dass Sie zu diesem Zeitpunkt im UI-Thread ausgeführt werden.

1

Schön und einfach. Machen Sie Ihre AsyncTask einen Wert zurückgeben:

public class TestClass extends AsyncTask<Void, Void, String>{ 

@Override 
protected String doInBackground(String... params) { 
//rest of code 

return output.toString(); 
} 
} 

Alles was Sie jetzt tun müssen, ist nach dem Aufruf .get() Methode aufrufen.ausführen()

TestClass tc = new TestClass(); 
tc.execute(); 
String output = tc.get(); 

Sehr sehr wichtiger Hinweis

Durch den Aufruf .get() direkt nach .execute() UI-Thread blockiert wird, bis die AsyncTask erfolgt. Dies ist dem Zweck von AsyncTask entgegengesetzt. Eine der Lösungen für dieses Problem besteht darin, der AsyncTask eine Callback-Schnittstelle hinzuzufügen, die beim Beenden aufgerufen wird und die Methode .get() in der Implementierung dieser Schnittstelle aufruft. Ein Beispiel zum Entwerfen einer Callback-Schnittstelle finden Sie unter here.

Verwandte Themen