我使用signalR hub connection从后端发送和接收消息,但当我发送消息时,它会重复多次,注意到当I send the first message it does not repeat and shows for one time,然后在发送the second message it repeats for and shows two times之后,然后在sending the message of the third it repeats and shows for three times之后,依此类推.

以下是主要活动代码:

public class MainActivity extends AppCompatActivity {

    Button sendBtn;

    HubConnection hubConnection;
    EditText edt_text;
    TextView txt_received;

    MessageAdapter messageAdapter;
    List<Chat> mChat;
    RecyclerView recyclerView;

    public void readMessages(String sender, String receiver, String message){
        Chat chat = new Chat(sender, receiver, message);
        mChat.add(chat);
        messageAdapter.notifyItemRangeChanged(messageAdapter.getItemCount(), mChat.size());
        messageAdapter.notifyDataSetChanged();
    }

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

        recyclerView = findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getApplicationContext());
        linearLayoutManager.setStackFromEnd(true);
        recyclerView.setLayoutManager(linearLayoutManager);
        mChat = new ArrayList<>();

        messageAdapter = new MessageAdapter(MainActivity.this, mChat, "default");
        recyclerView.setAdapter(messageAdapter);
        messageAdapter.notifyDataSetChanged();

        sendBtn = findViewById(R.id.sendBtn);
        edt_text = findViewById(R.id.edt_text);

        try {
            hubConnection = HubConnectionBuilder.create("URL").build();
            hubConnection.start();
            AtomicReference<String> state = new AtomicReference<>("");
            hubConnection.start().subscribe(() -> {
                state.set("Connect");
                    },
            error -> {
                state.set("error");
            });

            hubConnection.on("SendMessage", (param1, param2, param3, param4) -> {

               readMessages("Musab","Ahmed",param3);

            }, String.class, String.class, String.class, Integer.class);

        }
        catch (Exception e){
            String exMessage = e.getMessage();
        }

        sendBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                try {
                    if(edt_text.getText().toString().length() > 0){
                        if(hubConnection.getConnectionState() == HubConnectionState.DISCONNECTED){
                            hubConnection.start();
                        }

                        hubConnection.on("ReceiveMessage", (param1, param2, param3 , param4) -> {

                            readMessages("Ahmed","Musab",param3);

                        }, String.class, String.class, String.class, Integer.class);                      
                    }
                    else{
                        edt_text.setHint("Can not be empty");
                    }

                }catch (Exception ex){
                    String message ;
                    message = ex.getMessage();
                }
            }
        });
    }
}

下面是RecyclerView的适配器代码:

public class MessageAdapter extends RecyclerView.Adapter<MessageAdapter.ViewHolder> {

    public static final int MSG_TYPE_LEFT = 0;
    public static final int MSG_TYPE_RIGHT = 1;

    private Context mContext;
    private List<Chat> mChat;
    private String imageurl;

    public MessageAdapter(Context mContext, List<Chat> mChat, String imageurl) {
        this.mContext = mContext;
        this.mChat = mChat;
        this.imageurl = imageurl;
    }

    @NonNull
    @Override
    public MessageAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        if(viewType == MSG_TYPE_RIGHT){
            View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_right, parent, false);
            return new MessageAdapter.ViewHolder(view);
        }else{
            View view = LayoutInflater.from(mContext).inflate(R.layout.chat_item_left, parent, false);
            return new MessageAdapter.ViewHolder(view);
        }

    }

    @Override
    public void onBindViewHolder(@NonNull MessageAdapter.ViewHolder holder, int position) {
        Chat chat = mChat.get(position);

        holder.show_message.setText(chat.getMessage());
        holder.profile_image.setImageResource(R.mipmap.ic_launcher);

        holder.setItem_on_click_listener(new item_on_click_listener() {
            @Override
            public void onClick(View view, int position, boolean isLongClick) {

            }
        });

    }

    @Override
    public int getItemCount() {
        return mChat.size();
    }

    public  class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{

        public TextView show_message;
        public ImageView profile_image;

        private item_on_click_listener item_on_click_listener;

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

            show_message = itemView.findViewById(R.id.show_message);
            profile_image = itemView.findViewById(R.id.profile_image);

        }

        public void setItem_on_click_listener(item_on_click_listener item_on_click_listener){
            this.item_on_click_listener = item_on_click_listener;
        }

        @Override
        public void onClick(View view) {
            item_on_click_listener.onClick(view, getAdapterPosition(), false);
        }

        @Override
        public boolean onLongClick(View view) {
            item_on_click_listener.onClick(view, getAdapterPosition(), false);
            return true;
        }
    }

    @Override
    public int getItemViewType(int position) {
        i = position;
        if(mChat.get(position).getSender() == "Sender Name"){
            return MSG_TYPE_RIGHT;
        }
        else{
            return MSG_TYPE_LEFT;
        }
    }

    @Override
    public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
        recyclerView.refreshDrawableState();
    }
}

有谁能帮帮忙吗?

推荐答案

问题是onReceiveMessage方法必须在sendBtn OnClickListener之外,所以如果onReceiveMessagesendBtn OnClickListener之内,那么每次点击都会打开一个新的连接.

hubConnection.on("ReceiveMessage", (username, password, messageBody , receiverId) -> {

   //Do Something

}, String.class, String.class, String.class, Integer.class);

Java相关问答推荐

Java 22模式匹配不适用于记录模式匹配.给出汇编问题

Select 按位运算序列

Quarkus keycloat配置不工作.quarkus. keycloak. policy—enforcer. enable = true在. yaml表示中不工作

如何调整工作时间日历中的时间

如何让DTO接受空字符串字段,但如果它们不为空,则应用JPA验证?

在Spring Boot中使用哪个Java类来存储创建时间戳?

Jenv-相同的Java版本,但带有前缀

Java Mooc.fi Part 12_01.Hideout -返回和删除方法

如何创建模块信息类文件并将其添加到JAR中?

有谁能帮我修一下这个吗?使输出变得更加整洁

深度优先搜索实现:算法只向右搜索

如何处理两个几乎相同的XSD文件?

在线程Java中调用Interrupt()之后调用Join()

如何对存储为字符串的大数字数组进行排序?

如何在Java中的重写方法参数中强制(Enum)接口实现?

在单例类上获取Java锁,了解原因

为什么Instant没有从UTC转换为PostgreSQL的时区?

获取401未经授权,即使在标头中设置了浏览器名称和cookie

这是JavaFX SceneBuilder的错误吗?

获取月份';s在java中非UTC时区的开始时间和结束时间