2017-12-23 10 views
2

Android 용 블로그 앱을 개발 중이며 firebase를 백엔드에 사용하고 있습니다. 앱이 정상적으로 작동하지만 마지막 게시물로 스크롤하면 앱이 다운됩니다. 나는 꽤 오랫동안 해결책을 찾는데 일해 왔지만 아마도 아무 것도 찾을 수 없었다. 여기 아래로 스크롤하는 동안 Android 앱이 다운 됨

문제 내가 해결하기 위해 노력했습니다

FATAL EXCEPTION: main 
Process: com.example.akash.iametderick, PID: 12384 
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.Long to type com.example.akash.iametderick.Status 
at com.google.android.gms.internal.zzdzr.zzb(Unknown Source:842) 
at com.google.android.gms.internal.zzdzr.zza(Unknown Source:0) 
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10) 
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:22) 
at com.firebase.ui.database.ObservableSnapshotArray.getObject(ObservableSnapshotArray.java:160) 
at com.firebase.ui.database.CachingObservableSnapshotArray.getObject(CachingObservableSnapshotArray.java:40) 
at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:180) 
at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:217) 
at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6482) 
at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6515) 
at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5458) 
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5724) 
at android.support.v7.widget.GapWorker.prefetchPositionWithDeadline(GapWorker.java:285) 
at android.support.v7.widget.GapWorker.flushTaskWithDeadline(GapWorker.java:342) 
at android.support.v7.widget.GapWorker.flushTasksWithDeadline(GapWorker.java:358) 
at android.support.v7.widget.GapWorker.prefetch(GapWorker.java:365) 
at android.support.v7.widget.GapWorker.run(GapWorker.java:396) 
at android.os.Handler.handleCallback(Handler.java:790) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:164) 
at android.app.ActivityThread.main(ActivityThread.java:6494) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) 

받고 있어요에 대한 로그 여기

public class UserActivity extends AppCompatActivity { 
    private RecyclerView mStatusView; 
    private DatabaseReference mDatabase; 
    private DatabaseReference mDatabaseUsers; 
    private DatabaseReference mDatabaseLike; 

    private FirebaseAuth mFirebaseAuth; 

    private FirebaseAuth.AuthStateListener mAuthListener; 

    String userID = ""; 
    private Boolean exit = false; 
    private Boolean mProcessLike = false; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     setContentView(R.layout.activity_main); 

     mFirebaseAuth = FirebaseAuth.getInstance(); 
     mAuthListener = new FirebaseAuth.AuthStateListener() { 
      @Override 
      public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 

       if (firebaseAuth.getCurrentUser() == null) { 
        Intent loginIntent = new Intent(UserActivity.this, LoginActivity.class); 

        loginIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(loginIntent); 
       } 

      } 
     }; 

     mDatabase = FirebaseDatabase.getInstance().getReference().child("Status"); 
     mDatabaseUsers = FirebaseDatabase.getInstance().getReference().child("Users"); 
     mDatabaseLike = FirebaseDatabase.getInstance().getReference().child("Likes"); 

     mDatabaseUsers.keepSynced(true); 
     mDatabaseLike.keepSynced(true); 
     mDatabase.keepSynced(true); 

     mStatusView = findViewById(R.id.status_list); 
     mStatusView.setHasFixedSize(true); 
     mStatusView.setLayoutManager(new LinearLayoutManager(this)); 

    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 

     checkUserExists(); 

     mFirebaseAuth.addAuthStateListener(mAuthListener); 

     // Creating a Firebase recycle Adapter 
     FirebaseRecyclerAdapter<Status, StatusViewHolder> firebaseRecyclerAdapter = 
       new FirebaseRecyclerAdapter<Status, StatusViewHolder>(
         Status.class, 
         R.layout.status_row, 
         StatusViewHolder.class, 
         mDatabase 
       ) { 
        @Override 
        protected void populateViewHolder(StatusViewHolder viewHolder, Status model, int position) { 

         final String postKey = getRef(position).getKey(); 

         viewHolder.setTitle(model.getTitle()); 
         viewHolder.setDescription((model.getDescription())); 
         viewHolder.setImage(getApplicationContext(), model.getImage()); 

         viewHolder.mNumberOfLikesTextView.setVisibility(View.GONE); 

         viewHolder.setLikeButton(postKey); 
         viewHolder.mLikeButton.setOnClickListener(new View.OnClickListener() { 
          @Override 
          public void onClick(View view) { 

           mProcessLike = true; 
           mDatabaseLike.addValueEventListener(new ValueEventListener() { 

            @Override 
            public void onDataChange(DataSnapshot dataSnapshot) { 

             if (mProcessLike) { 
              if (dataSnapshot.child(postKey).hasChild(mFirebaseAuth.getCurrentUser().getUid())) { 
               mDatabaseLike.child(postKey).child(mFirebaseAuth.getCurrentUser().getUid()).removeValue(); 
               mProcessLike = false; 
               Toast.makeText(UserActivity.this, "Like removed", Toast.LENGTH_SHORT).show(); 

              } else { 
               mDatabaseLike.child(postKey).child(mFirebaseAuth.getCurrentUser().getUid()).setValue("RandomValue"); 
               mProcessLike = false; 
               Toast.makeText(UserActivity.this, "Liked", Toast.LENGTH_SHORT).show(); 

              } 
             } 
            } 

            @Override 
            public void onCancelled(DatabaseError databaseError) { 

            } 
           }); 

          } 
         }); 
        } 
       }; 

     mStatusView.setAdapter(firebaseRecyclerAdapter); 

    } 

    private void checkUserExists() { 

     try { 
      userID = mFirebaseAuth.getCurrentUser().getUid(); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
     mDatabaseUsers.addValueEventListener(new ValueEventListener() { 
      @Override 
      public void onDataChange(DataSnapshot dataSnapshot) { 
       if (!dataSnapshot.hasChild(userID)) { 

        Intent registerIntent = new Intent(UserActivity.this, 
          RegisterActivity.class); 
        registerIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
        startActivity(registerIntent); 

       } 
      } 

      @Override 
      public void onCancelled(DatabaseError databaseError) { 

      } 
     }); 

    } 

    // Setting up Recycler View 
    public static class StatusViewHolder extends RecyclerView.ViewHolder { 

     View mView; 

     ImageButton mLikeButton; 
     TextView mNumberOfLikesTextView; 

     DatabaseReference mDataBaseLike; 
     FirebaseAuth mAuth; 

     public StatusViewHolder(View itemView) { 
      super(itemView); 

      mView = itemView; 
      mLikeButton = itemView.findViewById(R.id.like_button); 
      mNumberOfLikesTextView = itemView.findViewById(R.id.number_of_likes_text_view); 

      mDataBaseLike = FirebaseDatabase.getInstance().getReference().child("Likes"); 
      mAuth = FirebaseAuth.getInstance(); 

      mDataBaseLike.keepSynced(true); 
     } 

     public void setLikeButton(final String postKey) { 
      mDataBaseLike.addValueEventListener(new ValueEventListener() { 
       @Override 
       public void onDataChange(DataSnapshot dataSnapshot) { 
        if (dataSnapshot.child(postKey).hasChild(mAuth.getCurrentUser().getUid())) { 
         mLikeButton.setImageResource(R.drawable.ic_thumb_up_blue_24dp); 
        } else { 
         mLikeButton.setImageResource(R.drawable.ic_thumb_up_black_24dp); 
        } 
       } 

       @Override 
       public void onCancelled(DatabaseError databaseError) { 

       } 
      }); 
     } 


     // Setting the title 
     public void setTitle(String title) { 
      TextView statusTitle = mView.findViewById(R.id.status_title_textView); 
      statusTitle.setText(title); 
     } 

     public void setDescription(String desc) { 
      TextView statusDescription = mView.findViewById(R.id.status_description_textView); 
      statusDescription.setText(desc); 
     } 

     public void setImage(Context context, String image) { 
      ImageView statusImage = mView.findViewById(R.id.status_image); 

      Picasso.with(context).load(image).into(statusImage); 

     } 
    } 
} 

을 문제에 직면하고 활동입니다 문제는 꽤 오래 있었지만 해결책을 찾지 못했습니다.

이 내 상태 노드 :

Status { 
    -L10rFvy6N-t7RiF7FJ6 { 
     date: ...; 
     description: ...; 
     image: ...; 
     title: ...'' 
    } 
    date: ...; 
    description: ...; 
    image: ...; 
    title: ...'' 
} 
+0

첫 번째 노드 데이터와 마지막 노드 데이터를 firebase 데이터에 게시 할 수 있습니까? – ABDevelopers

+1

"형식의 개체를 변환 할 수 없습니다."형식 불일치 오류입니다. 코드를 디버그하고 데이터베이스를 확인하십시오. – ADM

+0

당신의 에러는'DatabaseException : java.lang.Long 타입의 객체를 com.example.akash.iametderick.Status' 타입으로 변환 할 수 없습니다. 이것은 데이터베이스의 일부 데이터가 올바른 포맷이 아님을 의미합니다 – Marlon

답변

4

문제는 중포 기지에 저장된 데이터에 있습니다.

노드 StatusObject이고 데이터베이스의 해당 노드에 대한 값을 long으로 저장했을 수 있습니다.

그래서 데이터베이스를 확인하고 다른 노드와 비교하십시오. 특히 문제가있는 노드는 마지막으로 말한대로 when I scroll down to the last pos이므로 마지막 노드를 확인하십시오