Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数据从网络线程对象解析到另一个对象_Java_Android_Json_Multithreading - Fatal编程技术网

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

Java 将数据从网络线程对象解析到另一个对象,java,android,json,multithreading,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 MainAc

我想解析从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;
        }
    }
我的连接类如下

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;
        }
    }
package com.example.janitha.condd;
导入android.os.AsyncTask;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.io.Reader;
导入java.io.UnsupportedEncodingException;
导入java.net.HttpURLConnection;
导入java.net.URL;
/**
*由Janitha于2016年7月10日创建。
*/
公共类连接扩展了异步任务{
字符串finalData=“123”;
@凌驾
受保护的字符串doInBackground(字符串…URL){
//params来自execute()调用:params[0]是url。
试一试{
返回下载URL(URL[0]);
}捕获(IOE异常){
return“无法检索网页。URL可能无效。”;
}
}
//onPostExecute显示异步任务的结果。
@凌驾
受保护的void onPostExecute(字符串结果){
最终数据=结果;
}
公共字符串下载URL(字符串myurl)引发IOException{
InputStream=null;
int len=50000;
试一试{
URL=新URL(myurl);
HttpURLConnection conn=(HttpURLConnection)url.openConnection();
conn.setReadTimeout(10000/*毫秒*/);
conn.setConnectTimeout(15000/*毫秒*/);
conn.setRequestMethod(“GET”);
conn.setDoInput(真);
//启动查询
连接();
int response=conn.getResponseCode();
is=conn.getInputStream();
字符串contentAsString=readIt(is,len);
返回contentAsString;
}最后{
如果(is!=null){
is.close();
}
}
}
公共字符串readIt(InputStream stream,int len)引发IOException、UnsupportedEncodingException{
Reader=null;
读卡器=新的InputStreamReader(流,“UTF-8”);
char[]buffer=新字符[len];
读(缓冲区);
返回新字符串(缓冲区);
}
公共字符串getFinalData(){
返回最终数据;
}
}

每次代码执行时,它给我的值是123,这意味着我为变量finalData初始化的值。我的代码有什么问题?

您应该了解
AsyncTask
的工作原理。当您调用
con.execute(ur)
时,它在后台线程(非UI/主线程)上运行。现在,主线程上的控件到达
output=con.getFinalData()
,此时后台线程尚未完成任务,因此
con.getFinalData()
返回
“123”
,因为
finalData
尚未更新

您应该做的是向
AysncTask
提供回调,当调用
onPostExecute
时,您应该使用该回调返回结果

编辑1:

您的界面:

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.
   }
}
更改
异步任务的构造函数

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

我应该在哪里回电话?很抱歉,我对线程还不太熟悉programming@jan,检查更新的答案,我添加了回调实现。