我正在学习使用JSON解析URL中的数据。 在下面的代码中,我是URLConnection类对象,用于从URL获取数据。
代码不显示任何错误,但在执行时会产生空白屏幕。 我无法理解为什么会这样。
这是代码。
package com.example.asad.parse;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends AppCompatActivity {
TextView tv;
int count=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("asd", "calling call");
new GetJson().execute("http://api.androidhive.info/json/movies.json");
// try{
//
// call();
// }catch(Exception e) {
//
// }
}
public class GetJson extends AsyncTask<String, Void, Void>
{
@Override
protected Void doInBackground(String... params) {
Log.d("asd", params[0]);
// Log.d("asd","outside try");
StringBuffer sb=new StringBuffer();
URL url= null;
try {
Log.d("asd","inside call");
url = new URL(params[0]);
URLConnection tc = url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(
tc.getInputStream()));
Log.d("asd","above while.");
String line;
while ((line = br.readLine()) != null) {
Log.d("asd","inside while.");
JSONArray ja = new JSONArray(line);
for (int i = 0; i < ja.length(); i++) {
JSONObject jo = (JSONObject) ja.get(i);
Log.d("asd",jo.toString());
}
}
//
// tv=(TextView)findViewById(R.id.textView);
// tv.setText(sb);
Log.d("asd",sb.toString());
} catch (Exception e) {
e.printStackTrace();
Log.d("asd", "I am in catch");
}
return null;
}
}
}
答案 0 :(得分:1)
建议JSON使用StringBuilder。 你的代码可能有些问题:
mainfest.xml中的权限
<uses-permission android:name="android.permission.INTERNET"/>
使用静态方法从URL
返回完整的json文本public static String getData(String uri) {
BufferedReader reader = null;
try {
URL url = new URL(uri);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
StringBuilder sb = new StringBuilder();
reader = new BufferedReader(new InputStreamReader(con.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
sb.append((line + "\n"));
}
return sb.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
}
}
之后,您可以通过寻址正确的数组/对象来遍历您的json文本。 在AsyncTask中:
String jsonText = getData("http://api.androidhive.info/json/movies.json");
try {
JSONArray jsonArray = new JSONArray(jsonText);
...
}
之后开始阅读json对象
答案 1 :(得分:0)
在获得回复后更新视图,获得textview和setText。
答案 2 :(得分:0)
根据JAVA DOC
,一切看起来都不错尝试检查您的清单文件internet权限:
<uses-permission android:name="android.permission.INTERNET"/>
答案 3 :(得分:0)
你在catch条款中加入了一条日志声明但是你不看它写的是什么...... 首先使用StringBuffer和BufferedReader构建整个字符串,然后将其转换为json数组或对象。
URLConnection tc = url.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(tc.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
sb.append(line);
}
JSONArray ja = new JSONArray(sb.toString());
for (int i = 0; i < ja.length(); i++) {
JSONObject jo = (JSONObject) ja.get(i);
Log.d("asd", jo.toString());
}
} catch (Exception e) {
e.printStackTrace();
}