将数据从网络线程对象解析到另一个对象android

时间:2016-07-10 16:55:38

标签: java android json multithreading

我想解析从url返回到textview的JSON对象。因为我使用了扩展AsyncTask来获得网络连接的类。我的问题是我无法将返回的字符串值解析为我的主类。

我的主要课程如下

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);

 }
}

我的连接类如下

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

每次代码执行时,它给出的值为123,表示我为变量finalData初始化的值。我的代码出了什么问题?

1 个答案:

答案 0 :(得分:0)

您应该了解Employee_ComboBox.ItemsSource = null; Employee_ComboBox.ItemsSource = employees; 的工作原理。当你调用AsyncTask时,它会在后台线程上运行(关闭UI /主线程)。现在对主线程的控制达到con.execute(ur),到那时后台线程还没有完成任务,因此outcome =con.getFinalData()返回con.getFinalData(),因为"123"尚未更新。< / p>

你应该做的是提供finalData的回调,当调用AysncTask时,你应该使用该回调返回结果。

编辑1:

您的界面:

onPostExecute

您的活动应实现此目的:

public interface OnTaskCompleted {
    void onTaskCompleted(String value);
}

更改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) {

onPostExecute