NullPointerException при запуске из Google Play, но не из Android Studio - PullRequest
0 голосов
/ 25 апреля 2018

У меня большая проблема, я не знаю, что происходит, я загрузил приложение в Play Store, потому что когда я запускал его на эмуляторе или даже на моем реальном устройстве, оно не зависало, но сейчаскогда я загружаю его из Google Play, он говорит:

java.lang.NullPointerException: 
  at com..onBindViewHolder (ChooseCard.java)
  or                     .onCreateViewHolder (ChooseCard.java)
  at com..onBindViewHolder (ChooseCard.java)
  or                     .onCreateViewHolder (ChooseCard.java)
  at com.firebase.ui.database.FirebaseRecyclerAdapter.getItemCount (FirebaseRecyclerAdapter.java)
  or                     .onBindViewHolder (FirebaseRecyclerAdapter.java)
  or                     .onChildChanged (FirebaseRecyclerAdapter.java)
  or                     .onError (FirebaseRecyclerAdapter.java)
  at com.yarolegovich.discretescrollview.InfiniteScrollAdapter.access$100 (InfiniteScrollAdapter.java)
  or                     .getItemCount (InfiniteScrollAdapter.java)
  or                     .getItemViewType (InfiniteScrollAdapter.java)
  or                     .onAttachedToRecyclerView (InfiniteScrollAdapter.java)
  or                     .onBindViewHolder (InfiniteScrollAdapter.java)
  or                     .onCreateViewHolder (InfiniteScrollAdapter.java)
  or                     .wrap (InfiniteScrollAdapter.java)

Прошло много дней с этой проблемой, и я не могу ее найти, не могли бы вы мне помочь, пожалуйста?

Там мойbuild.gradle реализации

implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
implementation 'com.android.support:design:27.1.1'
implementation 'com.intuit.sdp:sdp-android:1.0.4'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
implementation 'com.android.support:cardview-v7:27.1.1'
implementation 'com.google.firebase:firebase-core:15.0.0'
implementation 'com.google.firebase:firebase-auth:15.0.0'
implementation 'com.google.android.gms:play-services-auth:15.0.0'
implementation 'com.google.firebase:firebase-database:15.0.0'
implementation 'com.anjlab.android.iab.v3:library:1.0.44'
implementation 'com.firebaseui:firebase-ui-database:3.3.1'
implementation 'com.onesignal:OneSignal:3.7.1'
implementation 'com.yarolegovich:discrete-scrollview:1.3.2'
implementation 'com.pranavpandey.android:dynamic-toasts:0.9.0'
implementation 'pl.droidsonroids.gif:android-gif-drawable:1.2.11'
implementation 'com.google.android.gms:play-services-analytics:15.0.0'
.....
 dependencies {
        classpath 'com.android.tools.build:gradle:3.1.2'
        classpath 'com.google.gms:google-services:3.2.1'

Редактировать

Я обновил свое приложение в Google Play и ничего не происходит, все еще сбой на том же Activity, теперь я знаю, что делать сотладка, проблема заключается в том, что я загружаю приложение из Google Play, на эмуляторе (даже в новом эмуляторе не происходит сбой) и на моем реальном устройстве.

As @ Marcos Vascondelos сказал, что я сделал Build> Genereate Signed APK> получить app-release.apk установить его на моем устройстве, и проблема в том, что я не могу войти, он идет по этому методу:

 @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);
                firebaseAuthWithGoogle(account);
            } catch (ApiException e) {
                // Google Sign In failed, update UI appropriately
                Log.w(TAG, "Google sign in failed", e.getCause());
                Toast with e.getCause is null
            }
        }
    }

Если вы хотитечтобы увидеть, как мне войти, чтобы не добавлять больше кода в этот квестЯ положил на это GitHubGist

Я читал, что это может быть проблемы с SHA-1, но я не знаю, почему на эмуляторе в порядке, устройство в порядке, Google Playвсе в порядке, но если я устанавливаю .apk напрямую, он говорит, что ноль.

LAST EDIT

Я вижу, проблема не в вызове Firebase, а в заполнении списка, язначит продукты ловятся правильно, но когда я пытаюсь внести в список то где он вылетает

Мой FirebaseRecyclerOptions адаптер выглядит как

 final FirebaseRecyclerOptions< CardPOJO > options =
                    new FirebaseRecyclerOptions.Builder< CardPOJO >()
                            .setQuery(products_ref, CardPOJO.class)
                            .build();



            adapter = new   FirebaseRecyclerAdapter< CardPOJO, CardHolder>(options) {
                @Override
                public CardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                    //inflate the single recycler view layout(item)
                    View view = LayoutInflater.from(parent.getContext())
                            .inflate(R.layout.card_product, parent, false);
                    final CardHolder cardViewHolder = new CardHolder(view);
                    return cardViewHolder;
                }



                @Override
                public void onDataChanged() {
                    super.onDataChanged();
                    if(progressDialog!=null)progressDialog.dismiss();initViews();
                }


                @Override
                protected void onBindViewHolder(final CardHolder holder, int position, final CardPOJO model) {
                    holder.itemView.setSelected(0== position); ////where you are in the list
                    holder.getLayoutPosition();
                    switch (model.getState()){
                        case "free":
                            holder.card_image.setImageResource();
                            break;
                        case "not_free":
                            if(userOwnsProduct(model.getProduct_id())){
                                holder.card_image.setImageResource();
                            }
                            else{
                                holder.card_image.setImageResource();
                            }

                            break;
                        default:
                            break;
                    }
                    holder.view.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            if(model.getState().equals("free")){
                                //normal stuff1

                            }
                            else{
                                if (!readyToPurchase) {
                                    DynamicToast.makeError(mContext,"Problems with Google Play",Toast.LENGTH_SHORT).show();
                                    return;
                                }
                                root_ref.child("PurchasedProducts").child(currentUser).addValueEventListener(new ValueEventListener() {
                                    @Override
                                    public void onDataChange(DataSnapshot dataSnapshot) {
                                        if(dataSnapshot.hasChild(model.getProduct_id())){
                                            //Normal stuff
                                        }
                                        else{
                                            bp.purchase((Activity) mContext,model.getProduct_id());
                                        }
                                    }

                                    @Override
                                    public void onCancelled(DatabaseError databaseError) {

                                    }
                                });

                            }

                        }
                    });


                }

            };
            adapter.startListening();



            infiniteAdapter = InfiniteScrollAdapter.wrap(adapter);
            itemPicker.setAdapter(infiniteAdapter);
            //.setItemTransitionTimeMillis(DiscreteScrollViewOptions.getTransitionTime());
            itemPicker.setItemTransformer(new ScaleTransformer.Builder()
                    .setMinScale(0.5f)
                    .build());

Ответы [ 4 ]

0 голосов
/ 06 мая 2018

Проблема заключалась в том, что при использовании Proguard я не использовал @Keep в своих классах pojo, поэтому при попытке сериализации класса с firebase база данных не находила атрибуты, потому что они были запутанными.

0 голосов
/ 02 мая 2018

Вы, кажется, перепробовали почти все, что я мог придумать. Это может быть проблемой с SHA-1. Попробуйте это:

  • Во-первых, проверьте, существует ли на самом деле ребенок, к которому вы обращаетесь (т.е. не ноль)
  • Попробуйте проверить, есть ли у вас доступ для добавления товаров. Также проверьте правила Firebase.
  • Попробуйте добавить продукт для разных типов пользователей (если ваше приложение содержит разные типы пользователей).
0 голосов
/ 04 мая 2018

ОК, вот и все! Я видел, что в коде есть аномалия, которую можно игнорировать, как в high-end apis. В простых словах для api 23 и> 23, например, получение контекста с помощью ViewGroup Parent в области viewHolder! это не проблема, но на небольших устройствах API, я думаю, что это будет проблемой!

так что попробуйте эту надежду, это поможет!

Может быть, я вижу это с этой точки зрения, надеюсь, это поможет

public CardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                                //inflate the single recycler view layout(item)
                           //  !!!!!!!!!!!!! **the issue is here**! !!!!!!!!!!!!!!!
                                View view = LayoutInflater.from(parent.getContext())
                                        .inflate(R.layout.card_product, parent, false);
                                final CardHolder cardViewHolder = new CardHolder(view);
                                return cardViewHolder;
                            }

У вас неправильно настроен макет! Получение контекста как это может быть причиной ИСКЛЮЧЕНИЯ NULL POINTER для этого класса! Есть простой способ сделать это! например, получить контекст действия, взяв его с помощью конструктора адаптера во время его создания.

вот пример!

public class yourActivity extends AppCompatActivity{
   YourAdapter mAdapter; 
/// lets say you are setting it up in android ONCREATE Method
@override
public void OnCreate(....){
...........

mAdapter(data,design,YourActivity.this);
 //here this will be the context going in your adapter simple

}

}

В конструкторе вашего адаптера вы можете хранить его в глобальной переменной, например, это может быть

public class YourAdapter extends RECYCLERView.Adapter......{
Context mContext;
public YourAdapter(Data data, int design,Context mContext)
this.mContext = mContext;
}
//and now you can access without any stress about context null exception 
   public CardHolder onCreateViewHolder(ViewGroup parent, int viewType) {
                            //inflate the single recycler view layout(item)
                            View view = LayoutInflater.from(mContext)
                                    .inflate(R.layout.card_product, parent, false);
                            final CardHolder cardViewHolder = new CardHolder(view);
                            return cardViewHolder;
                        }

ПЕРВАЯ АНОМАЛИЯ выставлена ​​и разрешена с помощью кода выше. второй, на который я надеялся, похож на это

Вы пытаетесь использовать RecyclerView, но не предоставляете ему подкласс для хранения представлений!

когда бы мы ни делали адаптер для представления переработчика, он должен был иметь подкласс для ViewHolder, чтобы он просто выполнял для нас переработку. основная работа этого подкласса состоит в том, чтобы удерживать Views и findThem, используя их идентификаторы

для общего примера попробуйте это ссылка Я нашел! кредит идет на git Writer.

0 голосов
/ 25 апреля 2018

Помните, всегда проверяйте, является ли компонент нулевым или нет. Чем выполнить ваш код. пример:

if ("your_component" != null){
//your code
}
...