You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android项目请求服务器失败:无法获取JSON数组,求技术支持

Hey there! Let's figure out why your Android app isn't getting a valid JSON response from the server and is returning null instead. Here are the most common issues to check, along with fixes and examples:

1. First, Verify Network Permissions & Security Config

Android blocks network access by default if you don't declare the right permissions.

  • Add this to your AndroidManifest.xml (right above the <application> tag):
    <uses-permission android:name="android.permission.INTERNET" />
    
  • If you're using plain HTTP (not HTTPS) on Android 9+, you need to allow cleartext traffic:
    Create res/xml/network_security_config.xml with:
    <?xml version="1.0" encoding="utf-8"?>
    <network-security-config>
        <base-config cleartextTrafficPermitted="true" />
    </network-security-config>
    
    Then add this attribute to your <application> tag in AndroidManifest.xml:
    android:networkSecurityConfig="@xml/network_security_config"
    
2. Check Your AsyncTask Network Implementation

Since your code snippet is incomplete, let's cover the critical parts that often cause null responses:

  • You must fully read the server's input stream (not just a single line)
  • Always check the HTTP response code before reading the response
  • Handle exceptions properly to avoid silent failures

Here's a corrected AsyncTask example that sends data and retrieves JSON:

private class SendDataToServerTask extends AsyncTask<String, Void, String> {
    private ProgressDialog progressDialog;
    private WeakReference<Activity> activityRef; // Avoid memory leaks

    public SendDataToServerTask(Activity activity) {
        this.activityRef = new WeakReference<>(activity);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        Activity activity = activityRef.get();
        if (activity != null) {
            progressDialog = ProgressDialog.show(activity, "Processing", "Sending data...", true);
        }
    }

    @Override
    protected String doInBackground(String... params) {
        String serverUrl = params[0];
        String postData = params[1]; // Your data in JSON format, e.g. {"name":"test"}
        HttpURLConnection connection = null;
        BufferedReader reader = null;
        String responseJson = null;

        try {
            URL url = new URL(serverUrl);
            connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setRequestProperty("Content-Type", "application/json");
            connection.setDoOutput(true);

            // Write your data to the server
            OutputStream os = connection.getOutputStream();
            os.write(postData.getBytes(StandardCharsets.UTF_8));
            os.flush();
            os.close();

            // Check if server returned a success code (200 OK)
            int responseCode = connection.getResponseCode();
            if (responseCode == HttpURLConnection.HTTP_OK) {
                // Read the full response
                InputStream is = connection.getInputStream();
                StringBuilder sb = new StringBuilder();
                reader = new BufferedReader(new InputStreamReader(is));
                String line;
                while ((line = reader.readLine()) != null) {
                    sb.append(line);
                }
                responseJson = sb.toString();
            } else {
                Log.e("NetworkError", "Server error code: " + responseCode);
            }
        } catch (IOException e) {
            Log.e("NetworkError", "Failed to connect to server", e);
        } finally {
            // Clean up resources
            if (connection != null) connection.disconnect();
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    Log.e("CleanupError", "Failed to close reader", e);
                }
            }
        }
        return responseJson;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Activity activity = activityRef.get();
        if (activity != null) {
            progressDialog.dismiss();
            if (result != null) {
                // Parse and use your JSON response here
                try {
                    JSONObject responseObj = new JSONObject(result);
                    new AlertDialog.Builder(activity)
                            .setTitle("Success!")
                            .setMessage("Server response: " + responseObj.toString())
                            .setPositiveButton("OK", null)
                            .show();
                } catch (JSONException e) {
                    Log.e("JsonError", "Invalid JSON format", e);
                    new AlertDialog.Builder(activity)
                            .setTitle("Error")
                            .setMessage("Server returned invalid JSON")
                            .setPositiveButton("OK", null)
                            .show();
                }
            } else {
                new AlertDialog.Builder(activity)
                        .setTitle("Error")
                        .setMessage("No response from server")
                        .setPositiveButton("OK", null)
                        .show();
            }
        }
    }
}
3. Validate the Server Side

Before blaming your app, confirm the server is working correctly:

  • Use tools like Postman or curl to send the exact same request your app sends
  • Check if the server returns a valid JSON response with a 200 OK status code
  • Ensure the server is receiving all your request data (parameters, headers) correctly
4. Key Debug Tips
  • Check Logcat for error messages: Look for NetworkError, JsonError, or any stack traces that point to network issues
  • Use WeakReference for your Activity in AsyncTask to avoid memory leaks (critical for long-running requests)
  • If you're targeting newer Android versions (API 30+), consider migrating from AsyncTask to Kotlin Coroutines or Retrofit—AsyncTask is deprecated and has limitations

内容的提问来源于stack exchange,提问作者kwooncy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:18:36