java - 致命异常 : main com. firebase.client.FirebaseException:无法弹回键入

标签 java android firebase android-recyclerview

我正在构建一个从 Firebase 检索数据的应用程序。要显示数据,我使用 recyclerview,当我移动到从火力基地获取数据的 Activity 时,我收到错误。

 E/AndroidRuntime: FATAL EXCEPTION: main
                                                 com.firebase.client.FirebaseException: Failed to bounce to type
                                                     at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
                                                     at com.sliit.dailyselfie.ActivityFeed.ActivityFeed.GetDataUpdates(ActivityFeed.java:129)
                                                     at com.sliit.dailyselfie.ActivityFeed.ActivityFeed$3.onChildAdded(ActivityFeed.java:156)
                                                     at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48)
                                                     at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
                                                     at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
                                                     at android.os.Handler.handleCallback(Handler.java:615)
                                                     at android.os.Handler.dispatchMessage(Handler.java:92)
                                                     at android.os.Looper.loop(Looper.java:137)
                                                     at android.app.ActivityThread.main(ActivityThread.java:4745)
                                                     at java.lang.reflect.Method.invokeNative(Native Method)
                                                     at java.lang.reflect.Method.invoke(Method.java:511)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
                                                     at dalvik.system.NativeStart.main(Native Method)
                                                  Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not instantiate value of type [simple type, class com.sliit.dailyselfie.ActivityFeed.SharePost] from String value; no single-String constructor/factory method
                                                     at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator._createFromStringFallbacks(StdValueInstantiator.java:428)
                                                     at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:299)
                                                     at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1056)
                                                     at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:136)
                                                     at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:123)
                                                     at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
                                                     at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
                                                     at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:181)
                                                     at com.sliit.dailyselfie.ActivityFeed.ActivityFeed.GetDataUpdates(ActivityFeed.java:129) 
                                                     at com.sliit.dailyselfie.ActivityFeed.ActivityFeed$3.onChildAdded(ActivityFeed.java:156) 
                                                     at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48) 
                                                     at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45) 
                                                     at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38) 
                                                     at android.os.Handler.handleCallback(Handler.java:615) 
                                                     at android.os.Handler.dispatchMessage(Handler.java:92) 
                                                     at android.os.Looper.loop(Looper.java:137) 
                                                     at android.app.ActivityThread.main(ActivityThread.java:4745) 
                                                     at java.lang.reflect.Method.invokeNative(Native Method) 
                                                     at java.lang.reflect.Method.invoke(Method.java:511) 
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
                                                     at dalvik.system.NativeStart.main(Native Method) 

使用的类是 SharePost.java

@JsonIgnoreProperties(ignoreUnknown=true)
public class SharePost {

    private String PostSharer;
    private String PostType;
    private String PostImage;
    private String PostDescription;
    private String PostedTime;
    @JsonIgnore
    private String PostID;


    public SharePost(){}

    public SharePost(String postSharer, String postType, String postImage, String postDescription, String postedTime, String postID) {
        PostSharer = postSharer;
        PostType = postType;
        PostImage = postImage;
        PostDescription = postDescription;
        PostedTime = postedTime;
        PostID = postID;
    }


    public String getPostSharer() {
        return PostSharer;
    }

    public void setPostSharer(String postSharer) {
        PostSharer = postSharer;
    }

    public String getPostType() {
        return PostType;
    }

    public void setPostType(String postType) {
        PostType = postType;
    }

    public String getPostImage() {
        return PostImage;
    }

    public void setPostImage(String postImage) {
        PostImage = postImage;
    }

    public String getPostDescription() {
        return PostDescription;
    }

    public void setPostDescription(String postDescription) {
        PostDescription = postDescription;
    }

    public String getPostedTime() {
        return PostedTime;
    }

    public void setPostedTime(String postedTime) {
        PostedTime = postedTime;
    }
}

我使用 firebase 检索编码的类

public class ActivityFeed extends AppCompatActivity {

BottomBar mBottomBar;
ArrayList<SharePost> SharedPosts;
RecyclerView RV;
AdapterAC adapterAC;
Firebase fire;
Dialog d;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_activity_feed);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    Firebase.setAndroidContext(this);
    SharedPosts = new ArrayList<>();

    fire=new Firebase("https://dailyselfie.firebaseio.com/SharePost");

    RV= (RecyclerView)findViewById(R.id.recycler1);
    RV.setLayoutManager(new LinearLayoutManager(this));


    mBottomBar = BottomBar.attach(this, savedInstanceState);
    mBottomBar.noNavBarGoodness();

        // this.RefreshData();

    mBottomBar.setItemsFromMenu(R.menu.bottomba_menu, new OnMenuTabClickListener() {
        @Override
        public void onMenuTabSelected(@IdRes int menuItemId) {

            if (menuItemId == R.id.nav_home) {

                Toast.makeText(ActivityFeed.this, "Timeline", Toast.LENGTH_SHORT).show();

            } else if (menuItemId == R.id.nav_fav) {
                showD();

            } else if (menuItemId == R.id.nav_gallery) {
                Toast.makeText(ActivityFeed.this, "Favorites", Toast.LENGTH_SHORT).show();

            }

            mBottomBar.mapColorForTab(0, ContextCompat.getColor(ActivityFeed.this, R.color.bottomPrimary));
            mBottomBar.mapColorForTab(1, ContextCompat.getColor(ActivityFeed.this, R.color.bottomPrimary));
            mBottomBar.mapColorForTab(2, ContextCompat.getColor(ActivityFeed.this, R.color.bottomPrimary));


        }

        @Override
        public void onMenuTabReSelected(@IdRes int menuItemId) {

        }
    });
    this.RefreshData();
}


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


}

public void RetriveData(){
       fire.addChildEventListener(new ChildEventListener() {
      @Override
      public void onChildAdded(DataSnapshot dataSnapshot, String s) {
          GetDataUpdates(dataSnapshot);
      }

      @Override
      public void onChildChanged(DataSnapshot dataSnapshot, String s) {
          GetDataUpdates(dataSnapshot);
      }

      @Override
      public void onChildRemoved(DataSnapshot dataSnapshot) {

      }

      @Override
      public void onChildMoved(DataSnapshot dataSnapshot, String s) {

      }

      @Override
      public void onCancelled(FirebaseError firebaseError) {

      }
  });
}

public void GetDataUpdates(DataSnapshot dataSnapshot ){
     SharedPosts.clear();

    for(DataSnapshot ds: dataSnapshot.getChildren()){

        SharePost sp = new SharePost();
        sp.setPostSharer(ds.getValue(SharePost.class).getPostSharer());
        sp.setPostType(ds.getValue(SharePost.class).getPostType());
        sp.setPostDescription(ds.getValue(SharePost.class).getPostDescription());
        sp.setPostImage(ds.getValue(SharePost.class).getPostImage());
        sp.setPostedTime(ds.getValue(SharePost.class).getPostedTime());



        SharedPosts.add(sp);

    }

     if(SharedPosts.size()>0){
            adapterAC = new AdapterAC(ActivityFeed.this,SharedPosts);
            RV.setAdapter(adapterAC);

    }else{
         Toast.makeText(ActivityFeed.this, "No data available", Toast.LENGTH_SHORT).show();
     }

}

public void RefreshData(){

    fire.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
             GetDataUpdates(dataSnapshot);
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            GetDataUpdates(dataSnapshot);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });

}


public  void save(String name,String type,String description,String date){

    SharePost sp = new SharePost();
    sp.setPostSharer(name);
    sp.setPostType(type);
    sp.setPostDescription(description);
    sp.setPostedTime(date);
    fire.push().setValue(sp);
    d.dismiss();


}

public  void showD(){
    d= new Dialog(ActivityFeed.this);
    d.setTitle("Save data");
    d.setContentView(R.layout.shr);
    final EditText name = (EditText)d.findViewById(R.id.editText);
    final EditText type = (EditText)d.findViewById(R.id.editText2);
    final EditText description = (EditText)d.findViewById(R.id.editText3);
    final EditText date = (EditText)d.findViewById(R.id.editText4);
    Button b = (Button)d.findViewById(R.id.button);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            save(name.getText().toString(),type.getText().toString(),description.getText().toString(),date.getText().toString());
            name.setText("");
            type.setText("");
            description.setText("");
            date.setText("");
        }
    });
    d.show();
}

}

如果有人能解释为什么我会收到此错误以及如何避免它,那就太好了。

最佳答案

您似乎正在尝试从 JSON 中太深的一层加载对象。

RetriveData 中,您有一个子监听器:

 public void onChildAdded(DataSnapshot dataSnapshot, String s) {
      GetDataUpdates(dataSnapshot);
  }

然后在GetDataUpdates中你有:

public void GetDataUpdates(DataSnapshot dataSnapshot ){
     SharedPosts.clear();

    for(DataSnapshot ds: dataSnapshot.getChildren()){

        SharePost sp = new SharePost();
        sp.setPostSharer(ds.getValue(SharePost.class).getPostSharer());
        sp.setPostType(ds.getValue(SharePost.class).getPostType());

最后一个循环现在正在迭代帖子的属性,而不是帖子。

如果您只是从 dataSnapshot 加载帖子,它可能会起作用:

public void GetDataUpdates(DataSnapshot dataSnapshot ){
    SharePost sp = dataSnapshot.getValue(SharePost.class);

如果这确实是问题的原因,您可能需要使用 addValueEventListener() 而不是 addChildEventListener()

关于java - 致命异常 : main com. firebase.client.FirebaseException:无法弹回键入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37022677/

相关文章:

android - 如何在 Android 手机上安装应用程序?

安卓初学者

ios - Swift 从 firebase 存储中删除图像

swift - 添加工具栏 JSQMessagesViewController

java - 调用performClick()函数时什么也没得到 - Android

java - 如何连接不同类中的多个ArrayList。 (java银行程序)

java - ConcurrentLinkedDeque 可以有固定大小并覆盖旧元素吗?

java - 任务未读取 Spark 累加器值

android - 仅使用 "web app"方法将 Firebase 添加到我的 Cordova 应用程序是否可行?

javascript - firebase onwrite 的云函数不触发任何执行