Java 将数据从网络线程对象解析到另一个对象
我想解析从url返回到textview的JSON对象。为此,我使用了扩展AsyncTask的类来获得网络连接。我的问题是我不能解析返回给我的主类的字符串值 我的主要课程如下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
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,检查更新的答案,我添加了回调实现。