【问题标题】:Java get JSON in Android TextView from URLJava从URL获取Android TextView中的JSON
【发布时间】:2017-09-06 06:26:44
【问题描述】:

我想从 Android Studio 的 TextView 中显示的 php 获取 JSON 响应。我现在有这段代码可以做到这一点,但它不起作用。据我所见,它甚至在打开应用程序时都不会运行。

public class MainActivity extends Activity {

private SQLiteHandler db;
private SessionManager session;

private String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
        sb.append((char) cp);
    }
    return sb.toString();
}

public JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try {
        BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
        String jsonText = readAll(rd);
        JSONObject json = new JSONObject(jsonText);
        return json;
    } finally {
        is.close();
    }
}

public void main(String[] args) throws IOException, JSONException {
    TextView txtUser = (TextView) findViewById(R.id.user);
    JSONObject json = readJsonFromUrl("http://piggybank.wordmediavormgever.nl/getSaldo.php");
    System.out.println(json.toString());
    System.out.println(json.getString("saldo"));
    try {
        JSONObject jsonObject = new JSONObject();
        String response = jsonObject.getString("saldo");
        txtUser.setText(response);

    } catch (JSONException e) {

        e.printStackTrace();
    }
}

谁能看到我做错了什么?来自 url 的响应是 {"saldo":783}.

【问题讨论】:

标签: java android json


【解决方案1】:

试试吧!

删除

   JSONObject jsonObject = new JSONObject();

并使用

   JSONObject json = readJsonFromUrl("http://piggybank.wordmediavormgever.nl/getSaldo.php");
  try {
    String response = json.getString("saldo");
    Log.e("AAAAAAAAA %s", response);

} 

您必须在 AsyncTask 中调用它。代码完成!!!

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test2);
    new GetDataSync().execute();
}

String saldo = "";

public class GetDataSync extends AsyncTask<Void, Void, Void> {


    @Override
    protected Void doInBackground(Void... params) {
        try {
            getData();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        txtUser.setText(saldo);
    }
}

private void getData() throws IOException, JSONException {
    JSONObject json = readJsonFromUrl("http://piggybank.wordmediavormgever.nl/getSaldo.php");
    try {
        String response = json.getString("saldo");
        Log.e("AAAAAAAAA %s", response);
        saldo = response;

    } catch (JSONException e) {

        e.printStackTrace();
    }
}

private String readAll(Reader rd) throws IOException {
    StringBuilder sb = new StringBuilder();
    int cp;
    while ((cp = rd.read()) != -1) {
        sb.append((char) cp);
    }
    return sb.toString();
}

public JSONObject readJsonFromUrl(String url) throws IOException, JSONException {
    InputStream is = new URL(url).openStream();
    try {
        BufferedReader rd = new BufferedReader(new InputStreamReader(is, Charset.forName("UTF-8")));
        String jsonText = readAll(rd);
        JSONObject json = new JSONObject(jsonText);
        return json;
    } finally {
        is.close();
    }
}

【讨论】:

  • ButterKnife.bind 的东西,这是为了什么? Cannot resolve symbol 'ButterKnife'
  • 好的,如果我运行此代码,我会在 Android 监视器中收到此响应:E/AAAAAAAAA %s: 0。没有其他事情发生,而且它没有在 TextView 中设置文本。
  • 您从服务器获取完整的数据。您将其设置为 TextView。
  • 是的,代码现在可以工作了,谢谢!但现在我有一个新问题。当我用我的应用程序登录时,它不记得我已经登录了。所以服务器给出了响应0。有没有简单的方法来解决这个问题?
  • 以上信息无法解决。需要添加源代码
【解决方案2】:

我认为问题出在 try 块的 main 函数中

JSONObject jsonObject = new JSONObject();
String response = jsonObject.getString("saldo");
txtUser.setText(response);

你的 jsonObject 是空的 你应该调用

String response = json.getString("saldo");
txtUser.setText(response);

还有一件事,当您进行网络调用时,您应该在后台线程中进行,而不是在 UI 线程中进行。(readJsonFromUrl 方法应该在后台线程中调用)

正如 Nguyễn Trung Hiếu 的回答所建议的那样

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2012-04-17
    相关资源
    最近更新 更多