Exception
05-12 15:42:45.791 11043-11043/ E/UncaughtException: java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 631792 bytes
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3776)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Caused by: android.os.TransactionTooLargeException: data parcel size 631792 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:615)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3700)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3768)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
05-12 15:42:47.247 11043-11043/ E/AndroidRuntime: FATAL EXCEPTION: main
Process: , PID: 11043
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 631792 bytes
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3776)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Caused by: android.os.TransactionTooLargeException: data parcel size 631792 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(Binder.java:615)
at android.app.ActivityManagerProxy.activityStopped(ActivityManagerNative.java:3700)
at android.app.ActivityThread$StopInfo.run(ActivityThread.java:3768)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6123)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
Fragment OnItemClick:-
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Bundle bundle = new Bundle();
ProdModel mProdModel = prodList.get(position);
bundle.putSerializable("object", mProdModel);
Intent intent = new Intent(getActivity(), DetailActivity.class);
intent.putExtra("bundle", bundle);
startActivityForResult(intent, 1);
}
});
In DetailActivity,
Bundle bundle = getIntent().getBundleExtra("bundle");
if (bundle != null) {
ProdModel model = (ProdModel) bundle.getSerializable("object");
}
DetailActivity Manifest,
<activity
android:name="com.mass.mysample.DetailActivity"
android:screenOrientation="portrait" />
Image Loading Using Picasso,
Picasso.with(this).load(model.getImage())
.placeholder(R.drawable.logo_without)
.fit().into(productimage);
Model Class
public class ProdModel implements Serializable {
private String seller_id;
String name;
private String image;
private float price;
private float specialprice;
private String entity_id;
private String productNumQuantity;
private String storetitle;
private String description;
private String discount;
private String max_price;
private String store_name;
private String StoreUrl;
public String getProductNumQuantity() {
return productNumQuantity;
}
public void setProductNumQuantity(String productNumQuantity) {
this.productNumQuantity = productNumQuantity;
}
public String getDiscount() {
return discount;
}
public void setDiscount(String discount) {
this.discount = discount;
}
public String getMax_price() {
return max_price;
}
public void setMax_price(String max_price) {
this.max_price = max_price;
}
public String getStore_name() {
return store_name;
}
public void setStore_name(String store_name) {
this.store_name = store_name;
}
public String getStoreUrl() {
return StoreUrl;
}
public void setStoreUrl(String storeUrl) {
StoreUrl = storeUrl;
}
public String getStoretitle() {
return storetitle;
}
public void setStoretitle(String storetitle) {
this.storetitle = storetitle;
}
public String getSeller_id() {
return seller_id;
}
public void setSeller_id(String seller_id) {
this.seller_id = seller_id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getEntity_id() {
return entity_id;
}
public void setEntity_id(String entity_id) {
this.entity_id = entity_id;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public float getSpecialPrice() {
return specialprice;
}
public void setSpecialPrice(float specialprice) {
this.specialprice = specialprice;
}
}
Data flow from TabActivity to fragment,
1.I have a TabActivity with ViewPager and Fragment.
2.In Fragment, I have a ListView.
3.The Data to fragment is passed from view pager adapter by set arguments.
Solutions I tried
1.A POJO class that implements Serialization.
2.I use Picasso to load the image from image URL.
3.This exception is thrown when OnItemClick on ListView in fragment passes data to DetailActivity to show all passed data.
4.I get this exception after the DetailActivity load's image and other data then app suddenly crashes.
5.I pass data in Intent was all POJO Object with Id, Name, Image URL, Price etc.,
Note:- App Crash only in NOUGAT
Finally, The fix I implemented
changing the targetSdkVersion to 23 from 25
After changing, my application not crashing in Nougat too.
All I have to Know is this proper solution or is there any workaround.
Please Guide to the proper way.
Thanks in advance.
Fragment
public class ProdFragment extends Fragment {
ListView listview;
SharedPreferences spref;
Boolean isInternetPresent = false;
ConnectionDetector cd;
private String toBeDisplayed,CatID;
private static final String TAG = ProdFragment.class.getSimpleName();
String totalProductCart;
private ArrayList<Root_SubCatModel> subCatList;
private ArrayList<ProdModel> prodList;
ProdAdapter adapter;
public ProdFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
spref = getActivity().getSharedPreferences(getResources().getString(R.string.myPref),
Context.MODE_PRIVATE);
Bundle bundle = getArguments();
if (bundle != null) {
int tabPosition = bundle.getInt("Tab_Position");
toBeDisplayed = bundle.getString("Tab_ToBeDisplayed");
CatID = bundle.getString("CategoryId");
subCatList = (ArrayList<Root_SubCatModel>) bundle.getSerializable("Tab_Data");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.prod_listview, container, false);
cd = new ConnectionDetector(getActivity());
listview = (ListView) rootView.findViewById(R.id.prodlist);
if (subCatList != null) {
adapter = new ProdAdapter(getActivity(),
CatID,
toBeDisplayed,
R.layout.list_product,
subCatList,
(ProductCartCountListener)getActivity());
listview.setAdapter(adapter);
adapter.notifyDataSetChanged();
prodList = new ArrayList<>();
for(int i = 0; i<subCatList.size();i++){
if (subCatList.get(i).getProd() != null) {
if(toBeDisplayed.equals("SubCategory")){
if (CatID.equals(subCatList.get(i).getCategory_id())) {
this.prodList = subCatList.get(i).getProd();
}
}else if(toBeDisplayed.equals("Products")) {
this.prodList = subCatList.get(i).getProd();
}
}
}
}
listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
Bundle bundle = new Bundle();
bundle.putSerializable("object", prodList.get(position));
Intent intent = new Intent(getActivity(), DetailActivity.class);
intent.putExtra("bundle", bundle);
startActivityForResult(intent,1);
}
});
return rootView;
}
public void showAlertDialog(Context context, String title, String message, Boolean status) {
AlertDialog alertDialog = new AlertDialog.Builder(context).create();
// Setting Dialog Title
alertDialog.setTitle(title);
// Setting Dialog Message
alertDialog.setMessage(message);
// Setting alert dialog icon
//alertDialog.setIcon((status) ? R.drawable.success : R.drawable.fail);
// Setting OK Button
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
// Showing Alert Message
alertDialog.show();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1) {
if (resultCode == Activity.RESULT_OK) {
Bundle b = data.getExtras();
if (b != null) {
ProdModel myobj = (ProdModel) b.getSerializable("Cart_Quantity");
if (myobj != null) {
if (prodList != null) {
for (ProdModel P : prodList) {
if (P.getEntity_id().equals(myobj.getEntity_id())) {
P.setProductNumQuantity(myobj.getProductNumQuantity());
}
}
}
Log.d(TAG,"Product_Id : " + myobj.getEntity_id()
+ ", Product_Cart_Count : " + myobj.getProductNumQuantity());
}
}
} else if (resultCode == 0) {
Log.d(TAG,"RESULT CANCELLED");
}
}
adapter.notifyDataSetChanged();
String totalProductCart = spref.getString("Cart_Count_Tool", "0");
Activity activity = getActivity();
if(activity instanceof TabActivity){
TabActivity myActivity = (TabActivity) activity;
Toolbar toolbar = (Toolbar) myActivity.findViewById(R.id.back_toolbar);
ImageView cart_imageview = (ImageView) toolbar.findViewById(R.id.cart_imageview);
cart_imageview.setImageDrawable(myActivity.buildCounterDrawable(
Integer.parseInt(totalProductCart)));
}
Log.d(TAG,"RESULT NOTIFIED");
}
public void refreshData(String productId, boolean isAddAsyncTaskComplete,
boolean isAddAsyncTaskLimitReached, boolean isDeleteAsyncTaskComplete){
adapter.setQuantityCount(prodList, productId, isAddAsyncTaskComplete,
isAddAsyncTaskLimitReached, isDeleteAsyncTaskComplete);
}
TabActivity Layout
<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.design.widget.TabLayout
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/storeimage"
android:textAlignment="center"
android:elevation="2dp"
android:minHeight="?attr/actionBarSize"
app:tabMode="scrollable"
app:tabTextColor="@color/color_dark_blue"
app:tabSelectedTextColor="@color/color_orange"/>
</android.support.design.widget.AppBarLayout>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior" />
</android.support.design.widget.CoordinatorLayout>
ListView
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/prodlist"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</FrameLayout>
onSaveInstanceState()
implementations? – ReadingDetailActivity
declaration in AndroidManifest.xml ? Btw, You should have useParcelable
instead ofSerializable
. I think switching toParcelable
will solve the problem – SynchronismFragment
inTabActivity
is trying to save its state. Its state is 640KB which is too large. Can you post the relevant code from theFragment
? Also your layout files. This problem has nothing to do with "Serializable vs. Parcelable" and it has nothing to do with theProdModel
in theBundle
. – TurneFragment
. The problem is not inDetailActivity
, the problem is in theFragment
inTabActivity
. – Turneprivate ArrayList<Root_SubCatModel> subCatList;
? You are callingsetArguments()
with aBundle
that contains this data for theFragment
. All data that you pass tosetArguments()
is saved automatically so that it persists acrossFragment
destruction and creation. I'm guessing that is where your problem is. Instead of doing this you could keep this data in theActivity
and theFragment
could get the data from theActivity
when it needs it. – Turne