我正在开发聊天应用程序,但我在刷新新邮件时遇到问题。 我编程说当打开聊天屏幕时,所有聊天消息都从数据库中提取并显示在屏幕上。 然后当用户点击发送按钮发送新的聊天消息时,我用
重新加载活动Intent i= new Intent("com.name.chat");
startActivity(i);
这样新的消息也会显示在屏幕上。现在,至少存在两个问题。
一个是我需要重新加载看起来不太好的整个活动,第二个是其他聊天用户不会看到第一个用户发送给他的新消息,直到他发送消息并重新加载他的活动。
有什么方法可以解决这个问题吗?
我尝试每隔10秒刷新后台活动,以便至少其他用户可以看到发送给他的消息而无需发送自己的消息,但是当我使用此代码时整个屏幕会冻结:
protected void onCreate(Bundle savedInstanceState) {
...
new Refresh().execute();
...
}
class Refresh extends AsyncTask<String, String, String> {
protected String doInBackground(String... args) {
while(true) {
SystemClock.sleep(10000);
Intent i= new Intent("com.name.chat");
startActivity(i);
}
}
}
我知道每隔几秒就有一次刷新活动的解决方案不是一个好的解决方案,但至少其他用户可以看到发送给他的消息。
如何创建Viber或WhatsApp,只是没有图片和类似内容的文本部分?
答案 0 :(得分:0)
我猜你要找的是定制广播。如下所述:http://developer.android.com/reference/android/content/BroadcastReceiver.html
与广播事件互动的可能性很多。所以刷新应该没问题。
但这不会解决你的第一个问题。我认为您应该只更新显示消息的视图。然后你不必重新加载整个东西,你会(根据你的布局的架构)不会意外地删除用户在广播接收器引起中断刷新时输入的文本。
答案 1 :(得分:0)
我们可以获得有关您的应用结构的更多详细信息吗? 它是本地网络聊天应用程序吗? 如何在应用程序中填充数据库? (通过网络服务?) 什么视图会呈现聊天消息? (一个ListView?...)
第一个想法:
您可以在后台运行服务,该服务将每n秒查询数据库以查看是否有任何新的聊天消息。
一旦有新消息可用,该服务可以通过广播意图通知您的活动。 (如上所述user2439890)
当您的活动在onReceive
回调中收到此广播时,它可以更新您负责显示聊天消息的视图,而不是重新加载整个活动内容视图。
第二个想法:
假设您有一个显示聊天消息的ListView,您可以使用CursorAdapter
支持它。在此适配器中,您将能够使用ListView行管理数据库行的Cursor
映射。
完成后,您可以每隔n秒使用一种调度Timer调用CursorAdapter.onNotifyDatasetChanged()来刷新ListView并使用可能的新数据库条目。
Timer timer = new Timer();
timer.scheduleAtFixedRate( new TimerTask() {
public void run() {
CursorAdapter.onNotifyDatasetChanged(); // will force the cursor to query the database, and to refresh the ListView with the new chat messages.
}
}, 1000, 30000 ); // will be executed every 30 seconds, or whatever you want.
第三个想法:如果您轮询远程服务器,则可以使用Google Cloud Messaging API。