【问题标题】:Class does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped类没有定义无参数构造函数。如果您使用 ProGuard,请确保这些构造函数没有被剥离
【发布时间】:2019-02-09 06:19:28
【问题描述】:

我正在尝试在 android studio 上创建一个聊天应用程序。我的应用程序没有构建错误,我可以启动应用程序。但是,当我使用 listOfMessage.setAdapter(adapter); 时,我的应用程序崩溃了。它确实启动了应用程序,但在我说 1-2 秒后它正在使应用程序崩溃。在logcat,我收到Class does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped error message.,您能告诉我如何解决这个问题吗?

当我不使用listOfMessage.setAdapter(adapter); 时,我在应用程序上写下的任何内容都不会显示在listview 上,但我看到条目通过firebase 正常。代码如下:

public class MainActivity extends AppCompatActivity {



private static int SIGN_IN_REQUEST_CODE = 1;
private FirebaseListAdapter<ChatMessage> adapter;
RelativeLayout activity_main;
FloatingActionButton sendButton;


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

    activity_main =(RelativeLayout)findViewById(R.id.activiy_main);
    sendButton = (FloatingActionButton) findViewById(R.id.sendButton);
    sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            EditText input = (EditText)findViewById(R.id.input);
            FirebaseDatabase.getInstance().getReference().push().setValue(new ChatMessage(input.getText().toString(),
                    FirebaseAuth.getInstance().getCurrentUser().getEmail()));
            input.setText("");
        }
    });


    if(FirebaseAuth.getInstance().getCurrentUser() == null) {
        startActivityForResult(AuthUI.getInstance().createSignInIntentBuilder().build(), SIGN_IN_REQUEST_CODE);
    }
    else
    {
        Snackbar.make(activity_main,"Welcome "+FirebaseAuth.getInstance().getCurrentUser().getEmail(),Snackbar.LENGTH_SHORT).show();
        displayChatMessage();
    }





}
private void displayChatMessage() {
    ListView listOfMessage = (ListView)findViewById(R.id.list_of_message);
    adapter = new FirebaseListAdapter<ChatMessage>(this,ChatMessage.class,R.layout.list_item,FirebaseDatabase.getInstance().getReference())
    {
        @Override
        protected void populateView(View v, ChatMessage model, int position) {
            TextView messageText, messageUser,messageTime;
            messageText = (TextView)v.findViewById(R.id.message_text);
            messageUser = (TextView)v.findViewById(R.id.message_user);
            messageTime = (TextView)v.findViewById(R.id.message_time);

            messageText.setText(model.getMessageText());
            messageUser.setText(model.getMessageText());
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",model.getMessageTime()));
        }
    };


    //BELOW ONE NEEDS TO BE ACTIVE...TO MAKE ENTRIES VISIBLE

    //listOfMessage.setAdapter(adapter);



}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == SIGN_IN_REQUEST_CODE)
    {
        if(resultCode == RESULT_OK)
        {
            Snackbar.make(activity_main, "Successfully signed in. Welcome !", Snackbar.LENGTH_SHORT).show();
            displayChatMessage();
        }
        else {
            Snackbar.make(activity_main, "we couldn't sign you in. Please try again", Snackbar.LENGTH_SHORT).show();
            finish();
        }
    }
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    if(item.getItemId() == R.id.menu_sign_out)
    {
        AuthUI.getInstance().signOut(this).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                Snackbar.make(activity_main,"You have been signed out..", Snackbar.LENGTH_SHORT).show();
                finish();
            }
        });
    }
    return true;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu,menu);
    return true;
}

}

和下面的ChatMessage.class

public class ChatMessage {

    private String messageText;
    private String messageUser;
    private  long messageTime;

    public ChatMessage(String messageText, String messageUser) {
        this.messageText = messageText;
        this.messageUser = messageUser;

        messageTime = new Date().getTime();
    }

    public ChatMessage(String messageText) {
        this.messageText = messageText;
    }

    public String getMessageText() {
        return messageText;
    }

    public void setMessageText(String messageText) {
        this.messageText = messageText;
    }

    public String getMessageUser() {
        return messageUser;
    }

    public void setMessageUser(String messageUser) {
        this.messageUser = messageUser;
    }

    public long getMessageTime() {
        return messageTime;
    }

    public void setMessageTime(long messageTime) {
        this.messageTime = messageTime;
    }
}

logcat 完全错误:

com.google.firebase.database.DatabaseException: Class com.example.cagrik.chat.ChatMessage does not define a no-argument constructor. If you are using ProGuard, make sure these constructors are not stripped.
        at com.google.android.gms.internal.firebase_database.zzku.zza(Unknown Source:44)
        at com.google.android.gms.internal.firebase_database.zzkt.zzb(Unknown Source:196)
        at com.google.android.gms.internal.firebase_database.zzkt.zza(Unknown Source:0)
        at com.google.firebase.database.DataSnapshot.getValue(Unknown Source:10)
        at com.firebase.ui.database.FirebaseListAdapter.parseSnapshot(FirebaseListAdapter.java:120)
        at com.firebase.ui.database.FirebaseListAdapter.getItem(FirebaseListAdapter.java:109)
        at com.firebase.ui.database.FirebaseListAdapter.getView(FirebaseListAdapter.java:137)
        at android.widget.AbsListView.obtainView(AbsListView.java:3189)
        at android.widget.ListView.makeAndAddView(ListView.java:2197)
        at android.widget.ListView.fillDown(ListView.java:824)
        at android.widget.ListView.fillFromTop(ListView.java:885)
        at android.widget.ListView.layoutChildren(ListView.java:1924)
        at android.widget.AbsListView.onLayout(AbsListView.java:2961)
        at android.view.View.layout(View.java:20854)
        at android.view.ViewGroup.layout(ViewGroup.java:6401)
        at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1080)
        at android.view.View.layout(View.java:20854)
        at android.view.ViewGroup.layout(ViewGroup.java:6401)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20854)
        at android.view.ViewGroup.layout(ViewGroup.java:6401)
        at android.support.v7.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:443)
        at android.view.View.layout(View.java:20854)
        at android.view.ViewGroup.layout(ViewGroup.java:6401)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at android.view.View.layout(View.java:20854)
        at android.view.ViewGroup.layout(ViewGroup.java:6401)
        at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1791)
        at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1635)
        at android.widget.LinearLayout.onLayout(LinearLayout.java:1544)
        at android.view.View.layout(View.java:20854)
        at android.view.ViewGroup.layout(ViewGroup.java:6401)
        at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
        at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
        at com.android.internal.policy.DecorView.onLayout(DecorView.java:945)
        at android.view.View.layout(View.java:20854)
        at android.view.ViewGroup.layout(ViewGroup.java:6401)
        at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2956)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2643)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1780)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7827)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:911)
        at android.view.Choreographer.doCallbacks(Choreographer.java:723)
        at android.view.Choreographer.doFrame(Choreographer.java:658)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:897)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6944)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)

【问题讨论】:

  • “我得到的类没有定义无参数构造函数”哪个类?请发布完整的堆栈跟踪。
  • @Michael com.google.firebase.database.DatabaseException:com.example.cagrik.chat.ChatMessage 类未定义无参数构造函数。如果您使用 ProGuard,请确保未剥离这些构造函数。
  • 在 com.google.android.gms.internal.firebase_database.zzku.zza(未知来源:44)在 com.google.android.gms.internal.firebase_database.zzkt.zzb(未知来源: 196)在 com.google.android.gms.internal.firebase_database.zzkt.zza(未知来源:0)在 com.google.firebase.database.DataSnapshot.getValue(未知来源:10)在 com.firebase.ui.database .FirebaseListAdapter.parseSnapshot(FirebaseListAdapter.java:120) 在 com.firebase.ui.database.FirebaseListAdapter.getItem(FirebaseListAdapter.java:109) 在 com.firebase.ui.database.FirebaseListAdapter.getView(FirebaseListAdapter.java:137)
  • 通过编辑以正确格式将其发布到您的问题中。另外,ChatMessage 类的代码在哪里,因为这就是错误所指的内容?
  • 好吧,正如错误消息所说,您的 ChatMessage 类没有无参数构造函数。所以你需要添加一个。

标签: android chat


【解决方案1】:

我只是想念:

public ChatMessage(){} 我的ChatMessage.class - 感谢@Michael 为我找到解决方案。

【讨论】:

  • 我不明白你的解决方案,因为在你的问题代码中你已经有了 ChatMessage 构造函数???
【解决方案2】:

如果您使用内部类,您也可以收到该消息。那么最好的办法就是将该内部类提取到它自己的文件中,在这种情况下:ChatMessage.java

【讨论】:

    【解决方案3】:

    在声明所有变量后,只需在 bean 文件中添加一个空的构造函数,即

    public ChatMessage() { }
    

    【讨论】:

      【解决方案4】:

      Kotlin 解决方案

      你需要放置辅助构造函数

      在 ChatMessage.kt 中添加以下代码

       constructor(
          messageText: String,
          messageUser: String,
          messageUserId: String) {
          this.messageText = messageText
          this.messageUser = messageUser
          messageTime = Date().getTime()
          this.messageUserId = messageUserId
      }
      
      constructor()   // **Add this**
      

      【讨论】:

      • 如果我在数据类中这样做会怎样?
      【解决方案5】:

      我有同样的错误,我忘记了构造函数:

      public ChatMessage() { }
      

      【讨论】:

        【解决方案6】:

        您必须添加一个默认构造函数:

        public ChatMessage() { }
        

        【讨论】:

          【解决方案7】:

          在您的 kotlin 代码中为数据类添加一个默认参数,并将它们中的每一个都设置为 null。例如

          data class Message(val name: String? = null, val userName: String? = null)

          【讨论】:

            【解决方案8】:

            只需添加这个构造函数

            public ChatMessage(){}
            

            【讨论】:

              【解决方案9】:

              这已经晚了,但将来可能会对某人有所帮助 科特林

              **change your from**
              
              data class ChatMessage(
                 var messageText: String?,
                 var messageUser: String?,
                 var messageTime: Long?)
              

              到此

              data class ChatMessage(
                 var messageText: String? = "",
                 var messageUser: String? = "",
                 var messageTime: Long? = 0)
              

              【讨论】:

              • 我对这一点的感激之情怎么强调都不为过。非常感谢!
              猜你喜欢
              • 2020-06-08
              • 2021-06-24
              • 2023-01-01
              • 2015-01-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多