如何在意图中传递自定义 class
How to pass custom class in an intent
我正在使用 Volley GET 方法,我成功获得了 response.Now 我尝试反序列化响应,然后我尝试在另一个 activity
中传递自定义 class
RequestQueue queue = Volley.newRequestQueue(getActivity());
mShowDialog();
String url = "************";
UTF8VolleySupport sr = new UTF8VolleySupport(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("response", response + "mm");
hideDialog(pDialog);
TrainsMainClass trainsMainClass;
Gson gson = new Gson();
try {
JSONObject jsonObject = new JSONObject(response);
String errorcode = jsonObject.getString("errorcode");
if (errorcode.equals("500")) {
Toast.makeText(getActivity(), jsonObject.getString("message"), Toast.LENGTH_SHORT).show();
}
if (jsonObject.has("data")) {
trainsMainClass = gson.fromJson(jsonObject.getString("data"), TrainsMainClass.class);
if (trainsMainClass != null) {
Intent intent = new Intent(getActivity(), TrainsActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("trainsMainClass", trainsMainClass);
intent.putExtras(bundle);
startActivity(intent);
getActivity().overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
hideDialog(pDialog);
NetworkResponse errorRes = error.networkResponse;
String stringData = "";
if (errorRes != null && errorRes.data != null) {
try {
stringData = new String(errorRes.data, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
Log.e("Error", stringData);
}
});
sr.setRetryPolicy(new DefaultRetryPolicy(
30000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
queue.add(sr);
public class TrainsActivity extends AppCompatActivity {
private TrainsMainClass trainsMainClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_trains);
trainsMainClass = new TrainsMainClass();
if (getIntent() != null) {
trainsMainClass = (TrainsMainClass) getIntent().getExtras().getSerializable("trainsMainClass");
if (trainsMainClass != null)
Log.e("trainsMainClass", trainsMainClass + "");
}
}
}
public class TrainsMainClass implements Serializable{
@Override
public String toString() {
return "TrainsMainClass{" +
"trainDeparture=" + trainDeparture +
", trainReturn=" + trainReturn +
'}';
}
@SerializedName("departure")
private Timetable trainDeparture;
@SerializedName("return")
private Timetable trainReturn;
}
这是我的来源,但是当我 运行 我的应用程序时我有例外。
我该如何解决我的问题?
`Parcelable` encountered `IOException` writing serializable object
为什么不直接在意图中传递 jsonResponse 字符串,稍后可以在您开始的新 activity 中进行解析!
intent.putExtraString("jsonResp", jsonObject.getString("data"));
startActivity(intent);
& 在你的另一个 activity 中,你可以使用 GSON
将响应解析为对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_trains);
trainsMainClass = new TrainsMainClass();
if (getIntent() != null) {
String response = getIntent().getExtraString("jsonResp");
if(response !=null){
trainsMainClass = gson.fromJson(, TrainsMainClass.class);
Log.e("trainsMainClass", trainsMainClass + "");
}
}
尽量避免在 Activity 之间传递大量数据,Intent
可以传递的数据大小有上限。或者,我建议做的是:
- 读取第一个
Activity
中的数据,解析它并存储在数据库或内存中。确保您的数据中有一个有意义的 ID 字段。
- 将带有
Intent
的 ID(可能是 int
、long
或 String
)传递给第二个 Activity
。
- 第二个
Activity
,通过ID从存储中获取数据。
对于您在活动之间传递的任何数量的数据,该解决方案都可以很好地扩展,此外,假设您将数据保存在内存中,您将不会支付序列化和反序列化的成本来自 Intent
.
的数据
我正在使用 Volley GET 方法,我成功获得了 response.Now 我尝试反序列化响应,然后我尝试在另一个 activity
中传递自定义 class RequestQueue queue = Volley.newRequestQueue(getActivity());
mShowDialog();
String url = "************";
UTF8VolleySupport sr = new UTF8VolleySupport(Request.Method.GET, url, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.e("response", response + "mm");
hideDialog(pDialog);
TrainsMainClass trainsMainClass;
Gson gson = new Gson();
try {
JSONObject jsonObject = new JSONObject(response);
String errorcode = jsonObject.getString("errorcode");
if (errorcode.equals("500")) {
Toast.makeText(getActivity(), jsonObject.getString("message"), Toast.LENGTH_SHORT).show();
}
if (jsonObject.has("data")) {
trainsMainClass = gson.fromJson(jsonObject.getString("data"), TrainsMainClass.class);
if (trainsMainClass != null) {
Intent intent = new Intent(getActivity(), TrainsActivity.class);
Bundle bundle = new Bundle();
bundle.putSerializable("trainsMainClass", trainsMainClass);
intent.putExtras(bundle);
startActivity(intent);
getActivity().overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
hideDialog(pDialog);
NetworkResponse errorRes = error.networkResponse;
String stringData = "";
if (errorRes != null && errorRes.data != null) {
try {
stringData = new String(errorRes.data, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
Log.e("Error", stringData);
}
});
sr.setRetryPolicy(new DefaultRetryPolicy(
30000,
DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
queue.add(sr);
public class TrainsActivity extends AppCompatActivity {
private TrainsMainClass trainsMainClass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_trains);
trainsMainClass = new TrainsMainClass();
if (getIntent() != null) {
trainsMainClass = (TrainsMainClass) getIntent().getExtras().getSerializable("trainsMainClass");
if (trainsMainClass != null)
Log.e("trainsMainClass", trainsMainClass + "");
}
}
}
public class TrainsMainClass implements Serializable{
@Override
public String toString() {
return "TrainsMainClass{" +
"trainDeparture=" + trainDeparture +
", trainReturn=" + trainReturn +
'}';
}
@SerializedName("departure")
private Timetable trainDeparture;
@SerializedName("return")
private Timetable trainReturn;
}
这是我的来源,但是当我 运行 我的应用程序时我有例外。 我该如何解决我的问题?
`Parcelable` encountered `IOException` writing serializable object
为什么不直接在意图中传递 jsonResponse 字符串,稍后可以在您开始的新 activity 中进行解析!
intent.putExtraString("jsonResp", jsonObject.getString("data"));
startActivity(intent);
& 在你的另一个 activity 中,你可以使用 GSON
将响应解析为对象 @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_trains);
trainsMainClass = new TrainsMainClass();
if (getIntent() != null) {
String response = getIntent().getExtraString("jsonResp");
if(response !=null){
trainsMainClass = gson.fromJson(, TrainsMainClass.class);
Log.e("trainsMainClass", trainsMainClass + "");
}
}
尽量避免在 Activity 之间传递大量数据,Intent
可以传递的数据大小有上限。或者,我建议做的是:
- 读取第一个
Activity
中的数据,解析它并存储在数据库或内存中。确保您的数据中有一个有意义的 ID 字段。 - 将带有
Intent
的 ID(可能是int
、long
或String
)传递给第二个Activity
。 - 第二个
Activity
,通过ID从存储中获取数据。
对于您在活动之间传递的任何数量的数据,该解决方案都可以很好地扩展,此外,假设您将数据保存在内存中,您将不会支付序列化和反序列化的成本来自 Intent
.