Android不用框架实现即时通讯的一种办法

文章摘要:通过多线程和Timer类实现每隔一秒从云数据库中获取数据
再通过handler实现主线程上UI界面的更新

话不多说,先介绍用Timer类实现每隔一秒从云数据库中获取数据(这里用message为例模拟消息的接收并且假设只有两个人在聊天)

第一步:使用JDBC连接MYSQL

import java.sql.Connection;
import java.sql.DriverManager;

public class ConnectDB {
    
    
    //注意:在mysql8.0及以上版本驱动包和驱动加载类都会改变
    private static final String DRIVER = "com.mysql.jdbc.Driver";
    private static final String USER_NAME = "XX";
    private static final String PASSWORD = "XX";
    //使用静态块每次只执行一次,注意这里我没用连接池因为不需要用到事务
    static Connection getConnection(){
    
    
        Connection connection = null;
        try{
    
    
            Class.forName(DRIVER);
            String url = "xxxx";//云数据库地址
            String dbName = "xxxx";//数据库名称
            String stringConnection = "jdbc:mysql://" + url + ":3306/" + dbName + "?characterEncoding=UTF-8";
            connection = DriverManager.getConnection(stringConnection,
                    USER_NAME,PASSWORD);
        }catch(Exception ex){
    
    
            ex.printStackTrace();
        }
        return connection;
   }
}

第二步:创建相应的类

public class Message {
    
    
    private int message_id;
    private int message_from_user_id;
    private String message_to_user_id;
    private String date;
    private String message_content;
    private int state;//state 0-未读  1-已读
    private int type; //type 什么类型的消息 0-文字 1-图片 2-声音
    private int chatting_group_id ; //聊天组的id
    public Message(int message_from_user_id, String message_to_user_id, String date, String message_content, int state, int type,int chatting_group_id) {
    
    
        this.message_from_user_id = message_from_user_id;
        this.message_to_user_id = message_to_user_id;
        this.date = date;
        this.message_content = message_content;
        this.state = state;
        this.type = type;
        this.chatting_group_id = chatting_group_id;
    }
    public Message(int message_id, int message_from_user_id, String message_to_user_id, String date, String message_content, int state, int type,int chatting_group_id) {
    
    
        this(message_from_user_id, message_to_user_id, date, message_content, state, type, chatting_group_id);
        this.message_id = message_id;
    }
    //getter 和 setter
    ...

第三步:创建工具类实现数据的检索功能

...
/**
 * 操作数据库的工具类
 */
public final class ManipulateDBTool {
    
    
    public static final int NB_MESSAGE_PER_PAGE = 10;
    private static Connection connection = null;
    static{
    
    
        connection = ConnectDB.getConnection();
    }
    //根据页码进行获取(每次获取十条)
    public static List<Message> getAllMessagesFromUserToUser(int from_user_id, int to_user_id,int page) throws SQLException {
    
     ;
        LinkedList<Message> messageList = new LinkedList<>();
        PreparedStatement stmt= null;
        ResultSet rs = null;
        String sql = "select * from message where message_from_user_id in(?,?) " +
                "and message_to_user_id in(?,?) order by message_id desc limit ?,?";
            try{
    
    
                stmt = connection.prepareStatement(sql);
                stmt.setInt(1,from_user_id);
                stmt.setInt(2,to_user_id);
                stmt.setInt(3,from_user_id);
                stmt.setInt(4,to_user_id);
                stmt.setInt(5,0);
                stmt.setInt(6,page*NB_MESSAGE_PER_PAGE);
                rs = stmt.executeQuery();
                while(rs.next()){
    
    
                    int message_id = rs.getInt(rs.findColumn("message_id"));
                    int message_from_user_id = rs.getInt(rs.findColumn("message_from_user_id"));
                    String message_to_user_id = rs.getString(rs.findColumn("message_to_user_id"));
                    Date date = rs.getTimestamp(rs.findColumn("date"));
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    String dateString = simpleDateFormat.format(date);
                    String message_content = rs.getString(rs.findColumn("message_content"));
                    int state = rs.getInt(rs.findColumn("state"));
                    int type = rs.getInt(rs.findColumn("type"));
                    int chatting_group_id = rs.getInt("chatting_group_id");
                    Message message = new Message(message_id,message_from_user_id,message_to_user_id,dateString,message_content,state,type,chatting_group_id);
                    messageList.addFirst(message);
                }
        }catch (SQLException ex){
    
    
            ex.printStackTrace();
        }finally {
    
    
            if(stmt!=null)
                stmt.close();
            if(rs!=null)
                rs.close();
        }
        return messageList;
    }

第四步:使用Timer类实现每隔一秒执行一个线程

import java.util.Timer;
import java.util.TimerTask;
public class ChattingRoomActivity extends AppCompatActivity {
    
     
    ...
    private Timer myTimer;
    private Thread t1;
    private List<Message> messageList;
    private int user_id;  
    private int friend_id;
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chatting_room);
        ...
        user_id = getIntent().getIntExtra("userId",-1);
        friend_id = getIntent().getIntExtra("friendId",-1);
        //设置计时器
        myTimer = new Timer();
         //每隔一段时间从数据库中调用数据
        myTimer.schedule(new TimerTask() {
    
    
            @Override
            public void run() {
    
    
               t1 = new Thread(new Runnable() {
    
    
                    @Override
                    public void run() {
    
    
                        try {
    
    
                            //不断地读取数据库中的消息信息
                            messageList = ManipulateDBTool.getAllMessagesFromUserToUser(userId,friend_id,0);
                        } catch (SQLException e) {
    
    
                            e.printStackTrace();
                        }
                    }
                });
                t1.start();
            }
        },1000,1000);
    }
}

之后我们就可以用Handler类实现页面的刷新

第四步:使用Handler类实现页面的刷新

在第三步基础上修改:

import java.util.Timer;
import java.util.TimerTask;
import android.os.Handler;//引入Handler包
import android.os.Looper;//引入Looper包这个包对于实现循环很重要
public class ChattingRoomActivity extends AppCompatActivity {
    
     
    ...
    private Timer myTimer;
    private Thread t1;
    private List<Message> messageList;
    private int user_id;  
    private int friend_id;
    //创建一个Handler的实例用于处理当前线程
    private Handler myHandler = new Handler(Looper.getMainLooper());
    private Runnable runnable;
    protected void onCreate(Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chatting_room);
        ...
        user_id = getIntent().getIntExtra("userId",-1);
        friend_id = getIntent().getIntExtra("friendId",-1);
        //设置计时器
        myTimer = new Timer();
         //每隔一段时间从数据库中调用数据
        myTimer.schedule(new TimerTask() {
    
    
            @Override
            public void run() {
    
    
               t1 = new Thread(new Runnable() {
    
    
                    @Override
                    public void run() {
    
    
                        try {
    
    
                            //读取数据库中的消息信息
                            messageList = ManipulateDBTool.getAllMessagesFromUserToUser(userId,friend_id,0);
                        } catch (SQLException e) {
    
    
                            e.printStackTrace();
                        }
                    }
                });
                t1.start();
            }
        },1000,1000);
        ...
         //每个一段时间刷新页面
        runnable = new Runnable() {
    
    
            @Override
            public void run() {
    
    
               //在这里加入要想实现的代码
               myHandler.postDelayed(runnable,1000);
            }
        };
        myHandler.postDelayed(runnable,1000);
    }
}

最后还是放上效果图(ps:由于大小限制gif图片比较模糊)
在这里插入图片描述
————————————————结束语——————————————
有什么问题可以在评论区留言

猜你喜欢

转载自blog.csdn.net/qq_31236027/article/details/104295227