文章摘要:通过多线程和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图片比较模糊)
————————————————结束语——————————————
有什么问题可以在评论区留言