当前位置: 首页 > 知识库问答 >
问题:

JSON数据不显示,而是显示空白屏幕

杨超
2023-03-14

试图制作一个简单的应用程序,从服务器获取JSON数据,并在自定义列表中显示它们,非常简单的事情。

但当我运行应用程序时,它显示的是白色空白屏幕,但没有数据。它也没有显示任何错误,我假设如果有任何错误,它不会在我的手机中运行。但不显示获取的数据。

下面是MainActivity

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;
        }
    }
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.root.employeedata.MainActivity">


    <ListView
        android:id="@+id/listView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginBottom="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

   </android.support.constraint.ConstraintLayout>
<?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>
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.root.employeedata">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission 
    android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" 
        />
            </intent-filter>
       </activity>
       </application>
  </manifest>

我发现的其他问题与我的问题不匹配,否则不会添加这个问题。

共有1个答案

冷浩瀚
2023-03-14

您正在主线程上执行网络请求。您可能会得到一个异常,但它被catch块掩盖了。

 catch (Exception e){
            e.printStackTrace();
        }

您需要使用AsyncTask来发出网络请求。

像这样的东西。创建一个内部类:

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);
            }
         }
     }
 }
 类似资料:
  • 这是我的代码,请记住,我在几天前学习了python,所以我的代码可能制作不正确,等等。我正在尝试制作一个窗口,该窗口将显示一些文本(测试版),并将显示两个小矩形,我想成为按钮。

  • 问题内容: 嗨,我正在制作一个游戏,并且在游戏中添加了一个共享按钮。我希望用户能够在一条消息中彼此共享一条消息,URL和屏幕快照。它的共享方面工作正常,并且一切正常,但屏幕快照本身显示为空白。这是我用来截屏的代码: 请帮助我解决此问题,请确保使用Swift语言来解决。如果这有所作为,我也使用SpriteKit技术。我是编码新手,所以请非常清楚。非常感谢你! 问题答案: 更新: Xcode 8.2.

  • 问题内容: 我正在使用Codeigniter,而不是错误消息,我只是得到一个空白页。有什么方法可以显示PHP错误消息吗?当我没有反馈时很难调试。 我的环境是带有Apache的Ubuntu。 问题答案: 由于到目前为止,没有一种解决方案对您有用,请尝试以下一种方法: 这明确地告诉PHP 显示 错误。某些环境可以默认禁用此功能。 这是我的环境设置的样子:

  • 我正在尝试使用 iReport 设计器(两者都具有空数据源)从主报告(report1.jrxml)创建一个子报告(report1_subreport3.jrxml)。主报表详细信息带包含静态文本(“主报表”),子报表元素和子报表在其相应的详细信息带中包含静态文本(“子报表”) 但单击主报表的预览选项卡仅显示静态文本“主报表”,而不显示子报表(“子报表”)的静态文本。 我还浏览了http://com

  • 我是一个完全不懂Android编程的人,通过阅读教程,我第一次尝试了它。问题是我用Android4.4.2的API创建了多个仿真器,但没有一个显示任何东西,只有空白屏幕..我用Google API 19试了一个AVD..这也不起作用..谁能指导我弄清楚它有什么问题..提前谢谢

  • 我一直在尝试让谷歌地图在Android Studio工作。 使用Google maps模板创建新项目时,效果很好。然而,当我在现有项目中实现地图时,它显示的只是一个灰色屏幕,左下角有一个徽标。 现有项目使用一个片段导航系统和一个单独的活动来承载所有其他片段类。但这不应该是问题的原因,因为我以与模板中相同的方式实现了映射,但它也不起作用。 我检查了Logcat输出,密钥验证没有错误。如果我更改密钥,