Получение Не удалось подпрыгнуть, чтобы ввести

Я получаю сообщение об ошибке, когда создаю приложение чата для Android, используя firebase. Когда я отправляю сообщение, все в порядке, но после отправки сообщения я получаю сообщение об ошибке. Ошибка выглядит так, как показано ниже.

04-17 15:21:54.242 12961-12961/learning.firebase.app.learningfirebase E/AndroidRuntime: FATAL EXCEPTION: main
    com.firebase.client.FirebaseException: Failed to bounce to type
        at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
        at learning.firebase.app.learningfirebase.FirebaseListAdapter$1.onChildAdded(FirebaseListAdapter.java:63)
        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:725)
        at android.os.Handler.dispatchMessage(Handler.java:92)
        at android.os.Looper.loop(Looper.java:176)
        at android.app.ActivityThread.main(ActivityThread.java:5365)
        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:1102)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
        at dalvik.system.NativeStart.main(Native Method)
     Caused by: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class learning.firebase.app.learningfirebase.Chat]: can not instantiate from JSON object (need to add/enable type information?)
     at [Source: java.io.StringReader@42285cd8; line: 1, column: 2]
        at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:984)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:276)
        at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
        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)
            ... 13 more

My MainActivity.java

public class MainActivity extends ListActivity {
    private static final String FIREBASE_URL = "https://bohrachat.firebaseio.com/";

    private String mUsername;
    private Firebase mFirebaseRef;
    private ValueEventListener mConnectedListener;
    private ChatListAdapter mChatListAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setupUsername();

        setTitle("Chatting as " + mUsername);

        // Setup our Firebase mFirebaseRef
        mFirebaseRef = new Firebase(FIREBASE_URL).child("chat");

        // Setup our input methods. Enter key on the keyboard or pushing the send button
        EditText inputText = (EditText) findViewById(R.id.messageInput);
        inputText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView textView, int actionId, KeyEvent keyEvent) {
                if (actionId == EditorInfo.IME_NULL && keyEvent.getAction() == KeyEvent.ACTION_DOWN) {
                    sendMessage();
                }
                return true;
            }
        });

        findViewById(R.id.sendButton).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendMessage();
            }
        });

    }
    @Override
    public void onStart() {
        super.onStart();
        // Setup our view and list adapter. Ensure it scrolls to the bottom as data changes
        final ListView listView = getListView();
        // Tell our list adapter that we only want 50 messages at a time
        mChatListAdapter = new ChatListAdapter(mFirebaseRef.limit(50), this, R.layout.chat_message, mUsername);
        listView.setAdapter(mChatListAdapter);
        mChatListAdapter.registerDataSetObserver(new DataSetObserver() {
            @Override
            public void onChanged() {
                super.onChanged();
                listView.setSelection(mChatListAdapter.getCount() - 1);
            }
        });

        // Finally, a little indication of connection status
        mConnectedListener = mFirebaseRef.getRoot().child(".info/connected").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                boolean connected = (Boolean) dataSnapshot.getValue();
                if (connected) {
                    Toast.makeText(MainActivity.this, "Connected to Firebase", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, "Disconnected from Firebase", Toast.LENGTH_SHORT).show();
                }
            }

            @Override
            public void onCancelled(FirebaseError firebaseError) {
                // No-op
            }
        });
    }

    @Override
    public void onStop() {
        super.onStop();
        mFirebaseRef.getRoot().child(".info/connected").removeEventListener(mConnectedListener);
        mChatListAdapter.cleanup();
    }

    private void setupUsername() {
        SharedPreferences prefs = getApplication().getSharedPreferences("ChatPrefs", 0);
        mUsername = prefs.getString("username", null);
        if (mUsername == null) {
            Random r = new Random();
            // Assign a random user name if we don't have one saved.
            mUsername = "JavaUser" + r.nextInt(100000);
            prefs.edit().putString("username", mUsername).commit();
        }
    }

    private void sendMessage() {
        EditText inputText = (EditText) findViewById(R.id.messageInput);
        String input = inputText.getText().toString();
        if (!input.equals("")) {
            // Create our 'model', a Chat object
            Chat chat = new Chat(input, mUsername,"Today : ");
            // Create a new, auto-generated child of that chat location, and save our chat data there
            mFirebaseRef.push().setValue(chat);
            inputText.setText("");

            Bundle b=new Bundle();
            b.putString("mUsername",mUsername);
            b.putString("mMessage",input);

            Intent intent = new Intent();
            intent.putExtras(b);
            intent.setAction("learning.firebase.app.learningfirebase.CUSTUM_INTENT");
            sendBroadcast(intent);

        }
    }

}


Chat.java


public class Chat {

    private String message;
    private String author;
    private String datetime;

    // Required default constructor for Firebase object mapping
    @SuppressWarnings("unused")

    Chat(String message, String author,String datetime) {
       this.message = message;
        this.author = author;
        this.datetime=datetime;
    }

    public String getMessage() {
        return message;
    }

    public String getAuthor() {
        return author;
    }

    public String getDatetime() {
        return datetime;
    }
}

ChatListAdapter.java

public class ChatListAdapter extends FirebaseListAdapter<Chat> {

    // The mUsername for this client. We use this to indicate which messages originated from this user
    private String mUsername;

    public ChatListAdapter(Query ref, Activity activity, int layout, String mUsername) {
        super(ref, Chat.class, layout, activity);
        this.mUsername = mUsername;
    }

    /**
     * Bind an instance of the <code>Chat</code> class to our view. This method is called by <code>FirebaseListAdapter</code>
     * when there is a data change, and we are given an instance of a View that corresponds to the layout that we passed
     * to the constructor, as well as a single <code>Chat</code> instance that represents the current data to bind.
     *
     * @param view A view instance corresponding to the layout we passed to the constructor.
     * @param chat An instance representing the current state of a chat message
     */
    @Override
    protected void populateView(View view, Chat chat) {
        // Map a Chat object to an entry in our listview
        String author = chat.getAuthor();
        TextView authorText = (TextView) view.findViewById(R.id.author);
        authorText.setText(author + ": ");
        // If the message was sent by this user, color it differently
        if (author != null && author.equals(mUsername)) {
            authorText.setTextColor(Color.RED);
        } else {
            authorText.setTextColor(Color.BLUE);
        }
        ((TextView) view.findViewById(R.id.message)).setText(chat.getMessage());
        ((TextView) view.findViewById(R.id.datetime)).setText(chat.getDatetime());
    }
}

Мой Firebase скриншот введите здесь описание изображения

Пожалуйста, помогите мне в этом. Я слежу за проектом чата firebase github. После того, как я просто добавлю одно значение, означает дату и время, я получаю эту ошибку.


person Qutbuddin Bohra    schedule 17.04.2016    source источник
comment
Какая часть сообщения об ошибке вам непонятна? Caused by: com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class learning.firebase.app.learningfirebase.Chat]: can not instantiate from JSON object (need to add/enable type information?)   -  person takendarkk    schedule 17.04.2016
comment
Вы задали тот же вопрос вчера, где вы оба были связаны с основной причиной, и я дал вам фрагмент для добавления. Причина, по которой вы все еще получаете сообщение об ошибке, заключается в том, что вы не добавили фрагмент, который я дал: конструктор, который не принимает аргументов public Chat() {}   -  person Frank van Puffelen    schedule 17.04.2016


Ответы (1)


Вкратце: сделайте класс Chat статическим и добавьте к нему конструктор без параметров/по умолчанию.

Минимальный код, который работает в одном файле (Main.java):

public class Main {
    public static class Chat {
        private String message;
        private String author;
        private String datetime;

        // Required default constructor for Firebase object mapping
        public Chat() {}

        public Chat(String message, String author, String datetime) {
            this.message = message;
            this.author = author;
            this.datetime = datetime;
        }

        public String getMessage() { return message; }    
        public String getAuthor() { return author; }    
        public String getDatetime() { return datetime; }    
    }    

    public static void main(String[] args) throws Exception {
        Firebase ref = new Firebase("https://stackoverflow.firebaseio.com/36675151/-KFaDuobfEA1FLslYZMM");
        ref.addListenerForSingleValueEvent(new ValueEventListener() {
            public void onDataChange(DataSnapshot dataSnapshot) {
                System.out.println(dataSnapshot.getValue(Chat.class));
            }

            public void onCancelled(FirebaseError error) {
            }
        });

        Thread.sleep(10000);
    }
}

Данные JSON:

"-KFaDuobfEA1FLslYZMM": {
  "author": "user73181",
  "datetime": "today heyy",
  "message": "xjcjcj"
}

Вещи, которые отличаются от вашего кода:

  • Я удалил все, что не имеет ничего общего с сообщением об ошибке. Например, это программа Java, а не программа Android. Это простое изменение устраняет тысячи потенциальных проблем. Но раз ваша проблема осталась, значит, проблема не связана с Android. Такое выделение проблемы значительно облегчает поиск причины. Обычно он известен как минимальный, полный/компилируемый проверяемый пример.
  • Я включил все в один файл. Это не только упрощает копирование/вставку, но и означает, что взаимодействие между файлами не может быть причиной. В данном случае это означало, что мне пришлось сделать класс Chat статическим, что, вероятно, является одной из причин вашей проблемы.
  • Мне пришлось добавить конструктор без параметров/по умолчанию, на что Като указал вам в [вашем предыдущем вопросе]. (Не удалось вернуться к типу, чат пример ошибки при добавлении другого значения) и то, что я сказал вам добавить. Вероятно, это вторая причина вашей проблемы.
  • Я включил JSON как текст, а не как изображение. Это означает, что теперь вы можете скопировать/вставить мой JSON, чтобы увидеть, связана ли ваша проблема с этим (кстати, это не так). Вы можете легко получить свой JSON, нажав кнопку «Экспорт» на панели инструментов Firebase. Это избавляет меня от необходимости вводить его.
person Frank van Puffelen    schedule 17.04.2016