有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java从URL获取Android TextView中的JSON

我想从Android Studio的文本视图中显示的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}


共 (2) 个答案

  1. # 1 楼答案

    我认为问题出在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你好ếu的回答建议

  2. # 2 楼答案

    试试看

    除去

       JSONObject jsonObject = new JSONObject();
    

    和使用

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

    您必须在异步任务中调用它。完成代码

    @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();
        }
    }