我想解析从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初始化的值。我的代码出了什么问题?
答案 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