Android中接收非JSON/空数据时的Activity处理及JSON数据传递问题
Android开发两类问题的解决方案
一、处理非JSON/空数据的提示弹窗
当你的Activity接收到空数据或者非JSON格式的数据时,核心思路是先做数据有效性校验,校验不通过就用弹窗给用户友好提示。这里结合你的MainAct1给出具体实现:
1. 数据校验逻辑
不管你是用HttpURLConnection还是OkHttp这类网络库请求数据,在拿到响应内容后,先做两步判断:
- 判断响应内容是否为空或者空白字符串
- 尝试解析JSON,捕获
JSONException来识别非JSON格式的数据
2. 弹窗实现代码
可以用Android原生的AlertDialog来实现提示,示例代码如下(假设你在网络请求的回调里处理):
// 假设你已经拿到了网络请求返回的responseContent if (TextUtils.isEmpty(responseContent)) { // 空数据提示 showErrorDialog("提示", "暂无数据,请稍后重试"); } else { try { // 尝试解析JSON JSONObject jsonObject = new JSONObject(responseContent); // 解析成功,继续后续逻辑 } catch (JSONException e) { Log.e(My_TAG, "非JSON格式数据", e); // 非JSON格式提示 showErrorDialog("数据错误", "获取到的数据格式异常,请稍后重试"); } } // 封装弹窗方法,方便复用 private void showErrorDialog(String title, String message) { new AlertDialog.Builder(this) .setTitle(title) .setMessage(message) .setPositiveButton("确定", (dialog, which) -> dialog.dismiss()) .setCancelable(false) .show(); }
注意:记得导入androidx.appcompat.app.AlertDialog或者android.app.AlertDialog,根据你的项目依赖来选择。
二、将JSON数据传递到另一个Activity
已经实现了JSON读取逻辑后,传递数据有两种常用方式,根据你的需求选择:
方式1:直接传递JSON字符串
如果另一个Activity需要自己解析JSON,直接把JSON字符串通过Intent传递最直接:
// 在MainAct1中,拿到JSON字符串后 String jsonData = "你的JSON内容"; Intent intent = new Intent(MainAct1.this, TargetActivity.class); intent.putExtra("KEY_JSON_DATA", jsonData); startActivity(intent); // 在TargetActivity中接收 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.target_layout); String receivedJson = getIntent().getStringExtra("KEY_JSON_DATA"); if (!TextUtils.isEmpty(receivedJson)) { // 在这里解析JSON try { JSONObject jsonObject = new JSONObject(receivedJson); // 处理解析后的数据 } catch (JSONException e) { e.printStackTrace(); } } }
方式2:传递解析后的序列化对象
如果已经把JSON解析成了Java对象,推荐把对象实现Parcelable接口后传递,这样更符合面向对象的开发方式:
- 先让你的数据类实现
Parcelable:
public class DataModel implements Parcelable { private String name; private int age; // 构造方法、getter/setter // 实现Parcelable的必备方法 protected DataModel(Parcel in) { name = in.readString(); age = in.readInt(); } public static final Creator<DataModel> CREATOR = new Creator<DataModel>() { @Override public DataModel createFromParcel(Parcel in) { return new DataModel(in); } @Override public DataModel[] newArray(int size) { return new DataModel[size]; } }; @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } }
- 在MainAct1中传递对象:
// 解析JSON成DataModel对象 DataModel model = new DataModel(); // 给model赋值... Intent intent = new Intent(MainAct1.this, TargetActivity.class); intent.putExtra("KEY_DATA_MODEL", model); startActivity(intent);
- 在TargetActivity中接收:
DataModel receivedModel = getIntent().getParcelableExtra("KEY_DATA_MODEL"); if (receivedModel != null) { // 使用model的数据 String name = receivedModel.getName(); int age = receivedModel.getAge(); }
内容的提问来源于stack exchange,提问作者ravi
相关产品推荐
相关产品推荐

