我在我的应用程序中使用MVP我遇到错误

Error reporting crash
    android.os.TransactionTooLargeException: data parcel size 1052448 bytes

我知道这个问题以前曾提出过,但其他解决方案对我不起作用。 我的活动是使用Google登录按钮将用户登录到Firebase

这是演示者代码:

View view;
    private final static int RC_SIGN_IN = 2;

    //TODO : try to find a way to edit this use
    FirebaseUser currentUser;

    GoogleApiClient  mGoogleApiClient;

    public GeneralSignActivityPresenter(View view){
        this.view = view;
    }

    public void signInWithGoogle(String requestIdToken) {

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(requestIdToken)
                .requestEmail()
                .build();
        if(mGoogleApiClient == null || !mGoogleApiClient.isConnected()){
             mGoogleApiClient = new GoogleApiClient.Builder((Context) view)//TODO : check this context, TODO : check why this variable isn't used
                .enableAutoManage((FragmentActivity) view, new GoogleApiClient.OnConnectionFailedListener() {//TODO : check this casting
                    @Override
                    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                        view.onGoogleConnectionFailed();
                        Log.v("Logging", "connection result is : " + connectionResult.toString());
                    }
                })
                .addApi(Auth.GOOGLE_SIGN_IN_API)
                .build();
        }
        GoogleSignInClient mGoogleSignInClient = GoogleSignIn.getClient((Context) view, gso);//TODO : check this context

        Intent signInIntent = mGoogleSignInClient.getSignInIntent();

        view.startSignIntent(signInIntent);
    }

    public void navigate(final String userType) {
        currentUser = FirebaseAuth.getInstance().getCurrentUser();
        String currentUserUid = currentUser.getUid();
        final DatabaseReference usersReference = FirebaseDatabase.getInstance().getReference("users");
        final DatabaseReference currentUserReference =  usersReference.child(currentUserUid);
        usersReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (!dataSnapshot.child(currentUser.getUid()).exists()) {
                    Map<String, Object> map = new HashMap<>();
                    map.put("userName", currentUser.getDisplayName());
                    map.put("userImage", currentUser.getPhotoUrl());
                    map.put("userEmail", currentUser.getEmail());
                    map.put("points", 0);
                    map.put("acceptedQuestions", 0);
                    map.put("refusedQuestions", 0);
                    map.put("acceptedLessons", 0);
                    map.put("refusedLessons", 0);
                    map.put("userType", userType);
                    usersReference.child(currentUser.getUid()).setValue(map);
                }
                else {
                    //TODO : check if this part is working or no
                    currentUserReference.child("userName").setValue(currentUser.getDisplayName());
                    currentUserReference.child("userImage").setValue(currentUser.getPhotoUrl());
                    currentUserReference.child("userType").setValue(userType);
                }
                view.goToMainActivity();
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

    public void checkCurrentUser(){
        if (currentUser != null) {
           view.goToMainActivity();
        }
    }

    public interface View {
        void onGoogleConnectionFailed();

这是活动代码:

  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_general_sign);
        ButterKnife.bind(this);
        FirebaseApp.initializeApp(this);
        presenter = new GeneralSignActivityPresenter(this);
        button = findViewById(R.id.googleBtn);
        userTypesSpinner = findViewById(R.id.userTypesSpinner);
        unStudentSignAlertText = findViewById(R.id.unStudentSignAlertText);


        ArrayAdapter<CharSequence> userTypesAdapter = ArrayAdapter.createFromResource(this,
                R.array.user_types_array, android.R.layout.simple_spinner_item);
        userTypesAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        userTypesSpinner.setAdapter(userTypesAdapter);

        userTypesSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                userType = adapterView.getItemAtPosition(i).toString();
                if (userType.equals("طالب")) {
                    unStudentSignAlertText.setVisibility(View.GONE);
                } else {
                    unStudentSignAlertText.setVisibility(View.VISIBLE);
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

       /* mCallbackManager = CallbackManager.Factory.create();
        LoginButton loginButton = findViewById(R.id.facebookBtn);
        loginButton.setReadPermissions("email", "public_profile");
        loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                Log.d(TAG, "facebook:onSuccess:" + loginResult);
                Toast.makeText(GeneralSignActivity.this, "onSuccess" + loginResult, Toast.LENGTH_SHORT).show();
                handleFacebookAccessToken(loginResult.getAccessToken());
            }

            @Override
            public void onCancel() {
                Log.d(TAG, "facebook:onCancel");
                Toast.makeText(GeneralSignActivity.this, "onCancel" , Toast.LENGTH_SHORT).show();

                // ...
            }

            @Override
            public void onError(FacebookException error) {
                Log.d(TAG, "facebook:onError", error);
                Toast.makeText(GeneralSignActivity.this, "onError : " + error, Toast.LENGTH_SHORT).show();

                // ...
            }
        });*/

// ...


        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                presenter.signInWithGoogle(getString(R.string.default_web_client_id));
            }
        });

        mCallbackManager = CallbackManager.Factory.create();
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
            try {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = task.getResult(ApiException.class);
                AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
                auth.signInWithCredential(credential)
                        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                if (task.isSuccessful()) {
                                    // Sign in success, update UI with the signed-in user's information
                                    presenter.navigate(userType);
                                } else {
                                    // If sign in fails, display a message to the user.
                                    Toast.makeText(GeneralSignActivity.this, "فشل التسجيل في التطبيق قد يكون لديك مشكلة في الإتصال بالانترنت أو أن إدارة البرنامج قامت بإلغاء تفعيل حسابك", Toast.LENGTH_SHORT).show();
                                    //updateUI(null);
                                }

                                // ...
                            }
                        });

                //Toast.makeText(this, "نجح تسجيل الدخول",Toast.LENGTH_SHORT).show();
            } catch (ApiException e) {
                Toast.makeText(GeneralSignActivity.this, "حدث خطأ أثناء محاولة التسجيل برجاء اعادة المحاولة", Toast.LENGTH_SHORT).show();

            }
        }//TODO
           // mCallbackManager.onActivityResult(requestCode, resultCode, data);

    }

    @Override
    public void onStart() {
        super.onStart();
        //TODO : note : don't try to update the users data here again
        presenter.checkCurrentUser();
    }

    @Override
    public void onGoogleConnectionFailed() {
        Toast.makeText(GeneralSignActivity.this, "حدث خطأ برجاء إعادة المحاولة", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void goToMainActivity() {
        startActivity(new Intent(GeneralSignActivity.this, MainActivity.class));
    }

    @Override
    public void startSignIntent(Intent signInIntent) {
        startActivityForResult(signInIntent, RC_SIGN_IN);
    }

            void goToMainActivity();

            void startSignIntent(Intent signInIntent);
        }

我为解决该错误做了很多尝试,但是我没有在两个类之间发送大数据,所以我不知道是什么问题。

  ask by Mostafa Khaled translate from so

本文未有回复,本站智能推荐:

2回复

如何使用MVP实现PhoneStateListener

我正在MVP中重构我的一个旧应用程序。 我已经重构了大多数逻辑,现在我坚持遵循以下逻辑。 在我的一项活动中,我实现了如下的PhoneStateLister。 我很难决定将该逻辑放在MVP中的哪个位置。 Activity应该处理这个PhoneStateListener还是演示者应该处理这
1回复

MVP(Android)中的演示者被删除/在Fragment中获取null

我正在使用MVP。 我的活动包含一个片段。 我正在初始化,然后将Presenter设置为Main-Activity的Create方法中的片段,如下所示。 在我的mainFrgament类中,我在setPresenterFunction中是settinf Presenter,如下所示。
3回复

在MVP模式下,Presenter应该是Android应用程序的活动性还是功能性

在使用MVP模式构建Android App时,我想知道应该使用演示者活动还是功能? 按活动量表示 ,与活动数量相等的演示者数量。 功能明智的手段,对每个功能时,应使用单独的演示。
1回复

我们是否需要用于AndroidMVP模式的登录以及SignupActivity的其他Presenter?

我在我的android应用程序中实现MVP设计架构。 我是设计模式的新手,在以前的项目中没有使用任何模式。 我想知道我们是否需要不同的主持人来进行不同的活动,例如“登录并注册”,还是仅需要一位主持人来处理这两项活动。 如果是,那么请引导我完成此过程,带有文件夹结构的示例代码将非常有帮助。
1回复

使用Mockito的AndroidMVP演示者单元测试导致“需要但未调用”错误

赏金将在 3 天后到期。 此问题的答案有资格获得+100声望奖励。 GremlinShX正在寻找此问题的更详细答案。
1回复

android.os.TransactionTooLargeException:数据包大小NOUGAT错误

我正在使用RETROFIT进行api调用,我从服务器接收到JSON响应,该响应的大小几乎不超过30kb。 JSON将响应解析为复杂的Object时,会引发此错误。 如果我尝试将响应存储在Object类中,然后通过LinkedHashMap获取值,则可以获取数据。 但是,这将是一个乏味的过
1回复

为什么我会收到TransactionTooLargeException?

我正在处理一个 Android 项目,但是当我需要从图库中拍照时我被卡住了。 确实,当我拍第一张照片时,一切都很顺利。 但是,如果我再拍一张照片,就会抛出异常“TransactionTooLargeException”并且我的应用程序崩溃了。 用于启动活动的代码: 获取结果的代码: 你有什么想法可以
1回复

传递ParcelableArrayList时,AndroidTransactionTooLargeException

我正在开发一个Android测验应用程序(我是初学者)。 所以我有一个Abstract类的Questions和三个关于问题类型的子类(多个答案,带有图像的问题以及是非题)。 我从三个不同的CSV文件中读取了问题,然后将它们存储在ArrayList<Questions> 。 我