Muk*_*r S 5 android fragment tabactivity runtimeexception android-viewpager
例外
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)
Run Code Online (Sandbox Code Playgroud)
片段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);
}
});
Run Code Online (Sandbox Code Playgroud)
在DetailActivity中,
Bundle bundle = getIntent().getBundleExtra("bundle");
if (bundle != null) {
ProdModel model = (ProdModel) bundle.getSerializable("object");
}
Run Code Online (Sandbox Code Playgroud)
DetailActivity清单,
<activity
android:name="com.mass.mysample.DetailActivity"
android:screenOrientation="portrait" />
Run Code Online (Sandbox Code Playgroud)
使用Picasso加载图像,
Picasso.with(this).load(model.getImage())
.placeholder(R.drawable.logo_without)
.fit().into(productimage);
Run Code Online (Sandbox Code Playgroud)
模型类
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;
}
}
Run Code Online (Sandbox Code Playgroud)
从TabActivity到片段的数据流,
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.
Run Code Online (Sandbox Code Playgroud)
我试过的解决方案
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.,
Run Code Online (Sandbox Code Playgroud)
注意: - 仅在NOUGAT中应用崩溃
最后,我实施的修复
将targetSdkVersion从25更改为23
更改后,我的应用程序也没有崩溃在Nougat.
我必须知道的是这个正确的解决方案还是有任何解决方法.
请指导正确的方法.
提前致谢.
分段
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);
}
Run Code Online (Sandbox Code Playgroud)
TabActivity布局
<?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>
Run Code Online (Sandbox Code Playgroud)
列表显示
<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>
Run Code Online (Sandbox Code Playgroud)
Dav*_*ser 19
你逝去的太多数据到你Fragment在setArguments().你Fragment会工作,但当它试图保存其实例状态时,它会溢出事务缓冲区.RuntimeException 如果您定位到Android 7.0(API 24或更高版本),则会抛出一个.为了保持向后兼容性而不破坏现有应用程序,仅在您使用API 24或更高版本时才会使用新行为.如果您将API <24,则会捕获并静默忽略事务缓冲区溢出异常.这意味着您的数据不会被持久保存,您可能(或可能不会)注意到这些数据.
你的代码坏了.您不应该将大量数据传递给Fragmentin setArguments().您可以将数据保存在您的Activity.当Fragment想要访问数据时,它总是可以这样:
// Get the owning Activity
MyActivity activity = (MyActivity)getActivity();
// Get the data from the Activity
List<Data> data = activity.getData();
Run Code Online (Sandbox Code Playgroud)
在你的Activity,写一个getData()方法,返回对Fragment所需数据的引用.
通过这种方式,数据保存在Activity并且Fragment可以随时访问它.
Android 7.0(Nogat)包括各种系统和API行为的变化.关于TransactionTooLarge异常:
在安卓7.0,多平台API现在已经开始检查整个粘合剂交易发送大的有效载荷,系统现在重新抛出TransactionTooLargeExceptions为RuntimeExceptions,而不是默默地记录或抑制它们.一个常见示例是在Activity.onSaveInstanceState()中存储过多数据,这会导致ActivityThread.StopInfo在您的应用针对Android 7.0时抛出RuntimeException.
可能的解决方案:1.在全局缓存中保存所需对象,并仅将密钥传递给DetailsActivity以检索对象.
| 归档时间: |
|
| 查看次数: |
6021 次 |
| 最近记录: |