Android利用异步任务AsyncTask发送post请求获取json数据
封面图
•
2025-10-03
•
Android开发
193
0
0
0
在 Android 开发中,`AsyncTask` 是一个用于在后台线程执行耗时操作(如网络请求)并在主线程更新 UI 的工具。虽然从 Android 11(API 30)开始,`AsyncTask` 被标记为**过时**(deprecated),但如果你还在使用较旧的 API 或者为了教学目的,仍然可以使用它来发送 POST 请求并获取 JSON 数据。 下面是一个使用 `AsyncTask` 发送 POST 请求并解析 JSON 数据的完整示例: --- ## ✅ 示例:使用 `AsyncTask` 发送 POST 请求并获取 JSON 数据 ### 1. 添加权限(在 `AndroidManifest.xml` 中) ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` --- ### 2. 创建 AsyncTask 类 ```java import android.os.AsyncTask; import android.util.Log; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; public class PostDataTask extends AsyncTask<String, Void, String> { private static final String TAG = "PostDataTask"; @Override protected String doInBackground(String... params) { String urlString = params[0]; // URL String jsonInputString = params[1]; // JSON 数据 try { URL url = new URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8"); try (OutputStream os = conn.getOutputStream()) { byte[] input = jsonInputString.getBytes("utf-8"); os.write(input, 0, input.length); } int responseCode = conn.getResponseCode(); Log.d(TAG, "Response Code: " + responseCode); BufferedReader reader = new BufferedReader( new InputStreamReader(conn.getInputStream(), "utf-8")); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } return response.toString(); } catch (IOException e) { e.printStackTrace(); return null; } } @Override protected void onPostExecute(String result) { if (result != null) { try { JSONObject jsonObject = new JSONObject(result); Log.d(TAG, "Received JSON: " + jsonObject.toString(2)); // 在这里处理 JSON 数据 } catch (Exception e) { e.printStackTrace(); } } else { Log.e(TAG, "Failed to get response"); } } } ``` --- ### 3. 在 Activity 中调用 AsyncTask ```java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String url = "https://example.com/api/endpoint"; String jsonData = "{\"key1\": \"value1\", \"key2\": \"value2\"}"; new PostDataTask().execute(url, jsonData); } } ``` --- ## 📌 注意事项 - **不推荐在新项目中使用 `AsyncTask`**,因为它是过时的,建议使用 `Thread`、`Handler`、`ExecutorService` 或现代库如 `Retrofit`、`OkHttp` 等。 - 如果你使用的是 Kotlin,可以考虑使用 `Coroutine` 或 `LiveData` 来处理异步任务。 - 处理 JSON 数据时,确保对异常进行捕获,避免程序崩溃。 --- ## ✅ 替代方案(推荐) 如果你正在开发新项目,建议使用如下方式替代 `AsyncTask`: - 使用 `OkHttp` 发送 HTTP 请求: ```java OkHttpClient client = new OkHttpClient(); RequestBody body = RequestBody.create(jsonData, MediaType.get("application/json; charset=utf-8")); Request request = new Request.Builder() .url("https://example.com/api/endpoint") .post(body) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { // 失败处理 } @Override public void onResponse(Call call, Response response) throws IOException { String responseBody = response.body().string(); // 解析 JSON 数据 } }); ``` --- 如果你需要我提供使用 `OkHttp` 或 `Retrofit` 的示例,也可以告诉我!
上一篇:
android控件 ToggleButton的应用
下一篇:
Android - Loading Spinner Tutorial
标题录入,一次不能超过6条
返回顶部
留言
留言
评论