Java JSON数据不显示,而是显示空白屏幕
尝试制作一个简单的应用程序,从服务器获取JSON数据并在自定义列表中显示它们,非常简单 但当我运行应用程序时,它会显示白色的空白屏幕,但没有数据。它也没有显示任何错误,我想如果有任何错误,它不会在我的手机上运行。但不显示获取的数据 这是Java JSON数据不显示,而是显示空白屏幕,java,android,json,Java,Android,Json,尝试制作一个简单的应用程序,从服务器获取JSON数据并在自定义列表中显示它们,非常简单 但当我运行应用程序时,它会显示白色的空白屏幕,但没有数据。它也没有显示任何错误,我想如果有任何错误,它不会在我的手机上运行。但不显示获取的数据 这是main活动类 package com.example.root.employeedata; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import an
main活动
类
package com.example.root.employeedata;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import org.json.JSONArray;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
List list = new ArrayList<String>();
String[] employees = new String[list.size()];
String data = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try{
URL url = new URL("http://anontech.info/courses/cse491/employees.json");
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while(line != null){
line = bufferedReader.readLine();
data = data + line;
}
JSONArray array = new JSONArray(data);
for(int i=0; i<array.length(); i++){
String employeeName = array.getJSONObject(i).getString("name");
list.add(employeeName);
}
for(int i=0; i<employees.length; i++){
employees[i] = list.get(i).toString();
}
}
catch (Exception e){
e.printStackTrace();
}
for(int i=0; i<employees.length; i++){
System.out.println(employees[i]);
}
ListView listView = (ListView) findViewById(R.id.listView);
CustomAdapter customAdapter = new CustomAdapter();
listView.setAdapter(customAdapter);
}
class CustomAdapter extends BaseAdapter{
@Override
public int getCount() {
return employees.length;
}
@Override
public Object getItem(int i) {
return null;
}
@Override
public long getItemId(int i) {
return 0;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
view = getLayoutInflater().inflate(R.layout.customlayout,null);
TextView textView = (TextView)view.findViewById(R.id.employeeName);
textView.setText(employees[i]);
return view;
}
}
}
这是自定义列表的customlayout.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/employeeName"
android:layout_width="wrap_content"
android:layout_height="69dp"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_weight="1"
android:text="TextView" />
</RelativeLayout>
这是运行应用程序时显示的内容
我发现的其他问题与我的问题不匹配,否则将不会添加此问题。这是因为您的employees字符串数组大小为0
List list = new ArrayList<String>();//initially it has 0 size
String[] employees = new String[list.size()];//list.size()==0
List List=new ArrayList()//最初它的大小为0
String[]employees=新字符串[list.size()]//list.size()==0
将employees字符串[]转换为Arraylist将解决您的问题
ArrayList<String> employees = new ArrayList<String>();
ArrayList employees=new ArrayList();
细节
看到这段代码了吗
for(int i=0; i<employees.length; i++){
employees[i] = list.get(i).toString();
}
for(int i=0;i您正在主线程上执行网络请求。您可能会收到异常,但它被catch块屏蔽了
catch (Exception e){
e.printStackTrace();
}
您需要使用进行网络请求
类似于以下内容。创建一个内部类:
private class GetJsonTask extends AsyncTask<URL, Void, String> {
protected String doInBackground(URL... urls) {
try{
HttpURLConnection httpURLConnection = (HttpURLConnection) urls[0].openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while(line != null){
line = bufferedReader.readLine();
data = data + line;
}
return data;
}
catch (Exception e){
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String result) {
if(result!=null){
JSONArray array = new JSONArray(result);
for(int i=0; i<array.length(); i++){
String employeeName = array.getJSONObject(i).getString("name");
list.add(employeeName);
}
}
}
}
私有类GetJsonTask扩展异步任务{
受保护的字符串doInBackground(URL…URL){
试一试{
HttpURLConnection HttpURLConnection=(HttpURLConnection)URL[0]。openConnection();
InputStream InputStream=httpURLConnection.getInputStream();
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream));
字符串行=”;
while(行!=null){
line=bufferedReader.readLine();
数据=数据+行;
}
返回数据;
}
捕获(例外e){
e、 printStackTrace();
}
返回null;
}
受保护的void onPostExecute(字符串结果){
如果(结果!=null){
JSONArray数组=新的JSONArray(结果);
对于(inti=0;i1)-确保您的服务器连接逻辑远离UI线程,您可以使用以下内容
4-使用而不是ListView
或至少使用ViewHolder
模式
5-完整示例
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import org.json.JSONArray;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView = (ListView) findViewById(R.id.listView);
// Make server logic inside Async Task.
new AsyncTaskHandler(new OnFinishCallback() {
@Override
public void onSuccess(List<String> result) {
CustomAdapter customAdapter = new CustomAdapter(result);
listView.setAdapter(customAdapter);
}
}).execute("http://anontech.info/courses/cse491/employees.json");
}
class CustomAdapter extends BaseAdapter {
private final List<String> employees;
public CustomAdapter(List<String> result) {
this.employees = result;
}
@Override
public int getCount() {
return employees.size();
}
@Override
public String getItem(int position) {
return employees.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
// Use ViewHolder pattern.
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final ViewHolder viewHolder;
if (view !=null){
viewHolder = (ViewHolder) view.getTag();
}else {
view = getLayoutInflater().inflate(R.layout.customlayout, null);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) view.findViewById(R.id.employeeName);
view.setTag(viewHolder);
}
viewHolder.textView.setText(getItem(i));
return view;
}
// Should use View Holder pattern
public class ViewHolder{
TextView textView;
}
}
/**
* Static inner class to handle memory leak with inner class.
*/
public static class AsyncTaskHandler extends AsyncTask<String, Void, List<String>> {
private final OnFinishCallback callback;
public AsyncTaskHandler(OnFinishCallback callback) {
this.callback = callback;
}
@Override
protected List<String> doInBackground(String... args) {
List<String> result = new ArrayList<>();
try {
URL url = new URL(args[0]);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
String data = "";
while (line != null) {
line = bufferedReader.readLine();
data = data + line;
}
JSONArray array = new JSONArray(data);
for (int i = 0; i < array.length(); i++) {
String employeeName = array.getJSONObject(i).getString("name");
result.add(employeeName);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(List<String> result) {
callback.onSuccess(result);
}
}
public interface OnFinishCallback{
void onSuccess(List<String> result);
}
}
导入android.os.AsyncTask;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.ListView;
导入android.widget.TextView;
导入org.json.JSONArray;
导入java.io.BufferedReader;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.ArrayList;
导入java.util.List;
公共类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
最终ListView ListView=(ListView)findViewById(R.id.ListView);
//在异步任务中创建服务器逻辑。
新的AsyncTaskHandler(新的OnFinishCallback(){
@凌驾
成功时公开作废(列表结果){
CustomAdapter CustomAdapter=新的CustomAdapter(结果);
setAdapter(customAdapter);
}
}).执行(”http://anontech.info/courses/cse491/employees.json");
}
类CustomAdapter扩展了BaseAdapter{
私人最终雇员名单;
公共CustomAdapter(列表结果){
这就是结果;
}
@凌驾
public int getCount(){
return employees.size();
}
@凌驾
公共字符串getItem(int位置){
返回员工。获取(职位);
}
@凌驾
公共长getItemId(int位置){
返回0;
}
//使用ViewHolder图案。
@凌驾
公共视图getView(int i、视图视图、视图组视图组){
最终持票人;
如果(视图!=null){
viewHolder=(viewHolder)view.getTag();
}否则{
view=GetLayoutFlater().充气(R.layout.customlayout,null);
viewHolder=新的viewHolder();
viewHolder.textView=(textView)view.findViewById(R.id.employeeName);
view.setTag(viewHolder);
}
viewHolder.textView.setText(getItem(i));
返回视图;
}
//应该使用视图保持器模式
公共类视图持有者{
文本视图文本视图;
}
}
/**
*使用内部类处理内存泄漏的静态内部类。
*/
公共静态类AsyncTaskHandler扩展了AsyncTask{
私有最终回调;
公共AsyncTaskHandler(OnFinishCallback回调){
this.callback=回调;
}
@凌驾
受保护列表doInBackground(字符串…参数){
列表结果=新建ArrayList();
试一试{
URL=新URL(参数[0]);
HttpURLConnection HttpURLConnection=(HttpURLConnection)url.openConnection();
InputStream InputStream=httpURLConnection.getInputStream();
BufferedReader BufferedReader=新的BufferedReader(新的InputStreamReader(inputStream));
字符串行=”;
字符串数据=”;
while(行!=null){
line=bufferedReader.readLine();
数据=数据+行;
}
JSONArray数组=新的JSONArray(数据);
对于(int i=0;iprivate class GetJsonTask extends AsyncTask<URL, Void, String> {
protected String doInBackground(URL... urls) {
try{
HttpURLConnection httpURLConnection = (HttpURLConnection) urls[0].openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
while(line != null){
line = bufferedReader.readLine();
data = data + line;
}
return data;
}
catch (Exception e){
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String result) {
if(result!=null){
JSONArray array = new JSONArray(result);
for(int i=0; i<array.length(); i++){
String employeeName = array.getJSONObject(i).getString("name");
list.add(employeeName);
}
}
}
}
// Make server logic inside Async Task.
new AsyncTaskHandler(new OnFinishCallback() {
@Override
public void onSuccess(List<String> result) {
CustomAdapter customAdapter = new CustomAdapter(result);
listView.setAdapter(customAdapter);
}
}).execute("http://anontech.info/courses/cse491/employees.json");
/**
* Static inner class to handle memory leak with inner class.
*/
public static class AsyncTaskHandler extends AsyncTask<String, Void, List<String>> {
private final OnFinishCallback callback;
public AsyncTaskHandler(OnFinishCallback callback) {
this.callback = callback;
}
.....
}
@Override
protected void onPostExecute(List<String> result) {
// Executed under UI thread to update UI component.
callback.onSuccess(result);
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final ViewHolder viewHolder;
.....
}
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
import org.json.JSONArray;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listView = (ListView) findViewById(R.id.listView);
// Make server logic inside Async Task.
new AsyncTaskHandler(new OnFinishCallback() {
@Override
public void onSuccess(List<String> result) {
CustomAdapter customAdapter = new CustomAdapter(result);
listView.setAdapter(customAdapter);
}
}).execute("http://anontech.info/courses/cse491/employees.json");
}
class CustomAdapter extends BaseAdapter {
private final List<String> employees;
public CustomAdapter(List<String> result) {
this.employees = result;
}
@Override
public int getCount() {
return employees.size();
}
@Override
public String getItem(int position) {
return employees.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
// Use ViewHolder pattern.
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final ViewHolder viewHolder;
if (view !=null){
viewHolder = (ViewHolder) view.getTag();
}else {
view = getLayoutInflater().inflate(R.layout.customlayout, null);
viewHolder = new ViewHolder();
viewHolder.textView = (TextView) view.findViewById(R.id.employeeName);
view.setTag(viewHolder);
}
viewHolder.textView.setText(getItem(i));
return view;
}
// Should use View Holder pattern
public class ViewHolder{
TextView textView;
}
}
/**
* Static inner class to handle memory leak with inner class.
*/
public static class AsyncTaskHandler extends AsyncTask<String, Void, List<String>> {
private final OnFinishCallback callback;
public AsyncTaskHandler(OnFinishCallback callback) {
this.callback = callback;
}
@Override
protected List<String> doInBackground(String... args) {
List<String> result = new ArrayList<>();
try {
URL url = new URL(args[0]);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String line = "";
String data = "";
while (line != null) {
line = bufferedReader.readLine();
data = data + line;
}
JSONArray array = new JSONArray(data);
for (int i = 0; i < array.length(); i++) {
String employeeName = array.getJSONObject(i).getString("name");
result.add(employeeName);
}
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
@Override
protected void onPostExecute(List<String> result) {
callback.onSuccess(result);
}
}
public interface OnFinishCallback{
void onSuccess(List<String> result);
}
}