2016-04-04 11 views
0

これは値を取得するために使用するメソッドです。AsyncTask/doInBackgroundから複数の値を返し、他のメソッドで使用します。

@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; 
    } 

JSONの値であるobj.getMake()などを使用したいと思います。しかし、それをやり直す方法を理解していないか、それを返す。私は戻り値、または最終的な使用する必要があります知っている。

+1

AsyncTaskクラスの中でonPostExecuteメソッドを実装します:)名前が示すように、doInBackgroundが実行を終了すると、これが呼び出されます。 onPostExecuteから呼び出したいメソッドを呼び出し、onPostExecuteで受け取ったレスポンスをパラメータとして渡します:)それはすべて –

+0

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

+2

[AsyncTask Androidの例]の可能な複製(http://stackoverflow.com/questions/9671546/asynctask-android-example) –

答えて

1

FOG

単にあなたのAsyncTaskクラス内onPostExecuteを実装:)

例えば:

@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 :) 
} 

これだけ仲間:) を今どのように来るこのonPostExecuteは、任意の値を取得しています? あなたは、あなたのdoInBackground署名バディの変化に気づくくださいdoInBackgroundメソッドの男:)

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

等から、それを返す必要が?そう私はあなたがdoInBackgroundの実行が完了したときに私が書いた場合、それは答えであるとして、あなたがonPostExecuteに文字列:)だから、

を返すことを通知されている文字列を書き込むことによって、文字列:)

にボイドから変更意志それは働く??いいえ。 あなたが

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

は、あなたが最後にボイドを見ることができようになりますあなたのdoInBackgroundあなたの非同期タスクの署名にボイドが指定されていることを考えると? :)しかし、今は、doInBackgroundはそれがとても同様AsyncTaskの署名を更新していない:)

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

今では罰金:)ハッピーコーディングバディを動作するはずchnagedてきた:)私の答えを願ってあなたを助け:)

+0

新しいGetClass(this).execute();これを使って実行し結果を得ることができますが、どのようにして単一の値しか使用できませんか? –

+0

それはどういう意味ですか?申し訳ありませんが、私はあなたの質問を正しく取得して、あなたはonPostExecuteに1つ以上の値を渡したいですか?それはあなたが欲しいものですか? –

+0

主なアイデアは、単なるデータの束を表示するだけではなく、別々に値を取得することです。 1)この値に基づいてこのデータをデータベースに送信したい2)このデータの一部を、ユーザーがリダイレクトされるURLの一部として使用したいと思います。 –

0

あなたはonPostExecute法上の出力だけでメソッドをオーバーライドして、その上に出力を得る

0

AsyncTaskは3(メイン)メソッド、onPreExecutedoInBackgroundonPostExecuteを持ってもらうことができます。 doInBackGroundのみがバックグラウンドスレッドで実行され、残りの2つはUIスレッドで実行されます。 (onProgressUpdateもありますが、ここでは省略します)

あなたのケースでは、doInBackgroundメソッドで必要なものを返してください。戻り値はonPostExecuteの入力パラメータになります。ここで、他の(到達可能な)メソッドを呼び出すことができます。その時点でUIスレッド内で実行していることを覚えておいてください。

1

ニースとシンプル。あなたのAsyncTaskは値を返してください:今すぐ

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

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

return output.toString(); 
} 
} 

あなたがしなければならないすべては、を呼び出した後に.get()メソッドを呼び出しています。(に.get呼び出すことにより()

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

非常に非常に重要な注意

を実行)AsyncTaskが行われるまで右.execute後に()あなたのUIスレッドがブロックされます。これはAsyncTaskの目的に直観的に反します。この問題の解決策の1つは、AsyncTaskにコールバックインターフェイスを追加することです。このインターフェイスは、終了時に呼び出され、そのインターフェイスの実装で.get()メソッドを呼び出します。コールバックインターフェイスを設計する方法の例については、hereを参照してください。