2016-07-10 8 views
-1

urlからtextviewに返すJSONオブジェクトを解析したいと思います。そのために、AsyncTaskを拡張してネットワーク接続を取得するクラスを使用しました。私の問題は、返す文字列の値をメインクラスに解析できないということです。ネットワークスレッドオブジェクトから別のオブジェクトにデータを解析するandroid

私のメインクラス

package com.example.janitha.condd; 

    import android.os.AsyncTask; 

    import java.io.IOException; 
    import java.io.InputStream; 
    import java.io.InputStreamReader; 
    import java.io.Reader; 
    import java.io.UnsupportedEncodingException; 
    import java.net.HttpURLConnection; 
    import java.net.URL; 

    /** 
    * Created by Janitha on 7/10/2016. 
    */ 
    public class Connection extends AsyncTask<String, Void, String> { 

     String finalData="123"; 
     @Override 
     protected String doInBackground(String... urls) { 

      // params comes from the execute() call: params[0] is the url. 
      try { 
       return downloadUrl(urls[0]); 
      } catch (IOException e) { 
       return "Unable to retrieve web page. URL may be invalid."; 
      } 
     } 
     // onPostExecute displays the results of the AsyncTask. 
     @Override 
     protected void onPostExecute(String result) { 
    finalData=result; 
     } 




     public String downloadUrl(String myurl) throws IOException { 
      InputStream is = null; 

      int len = 50000; 

      try { 
       URL url = new URL(myurl); 
       HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
       conn.setReadTimeout(10000 /* milliseconds */); 
       conn.setConnectTimeout(15000 /* milliseconds */); 
       conn.setRequestMethod("GET"); 
       conn.setDoInput(true); 
       // Starts the query 
       conn.connect(); 
       int response = conn.getResponseCode(); 

       is = conn.getInputStream(); 

       String contentAsString = readIt(is, len); 

       return contentAsString; 


      } finally { 
       if (is != null) { 
        is.close(); 
       } 
      } 
     } 
     public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException { 
      Reader reader = null; 
      reader = new InputStreamReader(stream, "UTF-8"); 
      char[] buffer = new char[len]; 
      reader.read(buffer); 
      return new String(buffer); 
     } 

     public String getFinalData() { 
      return finalData; 
     } 
    } 

コードは、それは私が変数finalDataために初期化された値を意味している私に123として値を与える実行されるたびに、次のように

package com.example.janitha.condd; 

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.widget.TextView; 

public class MainActivity extends AppCompatActivity { 

final String ur ="https://maps.googleapis.com/maps/api/place/textsearch/json?query=keells+super&location=6.849813513872538,79.90265075223242&key=AIzaSyDQ6fVTYb1_3MmD7j3Sei4CAhbZ_eIOphs"; 
String outcome=null; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     TextView tv=(TextView)findViewById(R.id.text1) ; 

     Connection con=new Connection(); 
     con.execute(ur); 

     outcome =con.getFinalData(); 
     tv.setText(outcome); 

} 
} 

私の接続クラスを次のように。私のコードで何が間違っていますか?

答えて

0

あなたはAsyncTaskの仕組みを理解する必要があります。 con.execute(ur)に電話すると、バックグラウンドスレッド(UI /メインスレッド外)で実行されます。メインスレッドの制御がoutcome =con.getFinalData()に達して、その時点でバックグラウンドスレッドはタスクを完了していないため、はまだ更新されていないため"123"を返します。con.getFinalData()"123"を返します。

AysncTaskにコールバックを提供することです。onPostExecuteが呼び出されたときは、そのコールバックを使用して結果を返す必要があります。

編集1:

あなたインタフェース:

public class MainActivity implements OnTaskCompleted { 
    //... 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    ... 
     Connection con=new Connection(MainActivity.this); 
     con.execute(url); 
    ... 
    } 

    @Override 
    public onTaskCompleted(String value) { 
     // you will receive the data here. 
    } 
} 

AsyncTaskのコンストラクタを変更:

public class Connection extends AsyncTask<String, Void, String> { 
     private OnTaskCompleted listener; 

     public Connection(OnTaskCompleted listener){ 
      this.listener=listener; 
     } 
     String finalData="123"; 
     @Override 
     protected String doInBackground(String... urls) { 
public interface OnTaskCompleted { 
    void onTaskCompleted(String value); 
} 

あなたの活動はこれを実装する必要がありますデータを返すonPostExecute

@Override 
protected void onPostExecute(String result) { 
    if(listener!=null) { 
     listener.onTaskCompleted(result); 
    } 
} 
+0

どこでコールバックする必要がありますか?私は本当にプログラミングのスレッド – jan

+0

@新、私はコールバックの実装を追加しました、更新された答えを確認するために新しいです申し訳ありません。 –

+0

ありがとう! – jan

関連する問題