2016-04-17 10 views
-1

Ich bekomme Fehler, während ich android Chat-App mit firebase bauen. Wenn ich eine Nachricht sende, ist es in Ordnung, aber nach dem Senden der Nachricht erhalte ich einen Fehler. Fehler sieht wie folgt aus.Getting "konnte nicht zum Typ springen"

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: [email protected]; 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 

Mein 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()); 
    } 
} 

Mein Firebase Screenshot enter image description here

Bitte helfen Sie mir darüber. Ich folge Firebase GitHub Chat-Projekt. Nachdem ich nur einen Wert hinzugefügt habe, bedeutet Datum Datum, ich bekomme diesen Fehler.

+1

Welcher Teil der Fehlermeldung macht für Sie keinen Sinn? 'Erstellt von: com.fasterxml.jackson.databind.JsonMappingException: Es wurde kein geeigneter Konstruktor für type gefunden [einfacher Typ, Klasse learning.firebase.app.learningfirebase.Chat]: kann nicht vom JSON-Objekt instanziiert werden (Typinformationen müssen hinzugefügt/aktiviert werden) ?) ' – csmckelvey

+1

Sie [die gleiche Frage gestern gepostet] (http://stackoverflow.com/questions/36660078/failed-to-bounce-to-type-chat-example-error-when-adding-another-value), wo du beide mit der Grundursache verbunden warst und ich gab dir das Snippet zum hinzufügen. Der Grund, dass Sie immer noch den Fehler erhalten, ist, dass Sie das Snippet, das ich gab, nicht hinzugefügt haben: ein Konstruktor, der keine Argumente annimmt. Public Chat() {} ' –

Antwort

1

tl; dr: Machen Sie die Chat Klasse statisch und fügen Sie ihr einen parameterlosen/Standardkonstruktor hinzu.

Minimal-Code, der in einer einzigen Datei funktioniert (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); 
    } 
} 

Die JSON-Daten:

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

Die Dinge, die aus dem Code unterschiedlich sind:

  • I alles entfernt, was nichts mit der Fehlermeldung zu tun hat. Zum Beispiel ist dies ein Java-Programm, kein Android-Programm. Diese einfache Änderung beseitigt Tausende potentieller Probleme. Da Ihr Problem jedoch weiterhin besteht, bedeutet dies, dass das Problem nicht mit Android zusammenhängt. Diese Art der Isolierung des Problems macht es viel einfacher, die Ursache zu finden. Es ist in der Regel als minimal, complete/compilable verifiable example bekannt.
  • Ich habe alles in einer einzigen Datei enthalten. Dies vereinfacht nicht nur das Kopieren/Einfügen, sondern bedeutet auch, dass die Interaktion zwischen Dateien nicht die Ursache sein kann. In diesem Fall bedeutete es, dass ich die Chat Klasse statische machen musste, was wahrscheinlich eine Ursache für Ihr Problem ist.
  • Ich musste einen parameterlosen/default Konstruktor hinzufügen, worauf Kato auf [Ihre vorherige Frage] hingewiesen hat. (Failed to bounce to type, Chat example error when adding another value,) und was ich dir gesagt habe hinzuzufügen. Dies ist wahrscheinlich die zweite Ursache für Ihr Problem.
  • Ich habe den JSON als Text statt als Bild eingefügt. Das bedeutet, dass Sie jetzt meinen JSON kopieren und einfügen können, um zu sehen, ob Ihr Problem damit zusammenhängt (das ist nicht der Fall). Sie können Ihren JSON einfach abrufen, indem Sie in Ihrem Firebase-Dashboard auf die Schaltfläche "Exportieren" klicken. Das erspart mir das Tippen.
+0

Danke. Ich habe es gelöst –

Verwandte Themen