好的,这是我的场景:
我正在开发一个聊天,使用 JSON(我们现在没有 Jabber 服务器)。有一项服务每 30 秒请求一次新的聊天消息:
public class ChatService extends Service {
ArrayList<NameValuePair> params;
int subnotid;
String urlaskmessages;
String response;
ArrayList<String> mensajes;
Timer timer=new Timer();
@Override
public void onCreate() {
super.onCreate();
subnotid=General.subnotid;
urlaskmessages=getString(R.string.host)+getString(R.string.appnamespace)+getString(R.string.chatpedir);
mensajes=new ArrayList<String>();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
Log.i("CHAT", "Llamamos al servicio ChatService");
llamarServicio();
}
}, 0, 30000);
}
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
public void llamarServicio(){
Thread thread=new Thread(){
public void run(){
params=new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("subnotid", String.valueOf(subnotid)));
try {
response=CustomHttpClient.executeHttpPost(urlaskmessages, params);
mensajes=parseJSON(response);
if(mensajes!=null){
General.mensajes.clear();
for (int i=0;i<mensajes.size();i++){
General.mensajes.add(i, mensajes.get(i));
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private ArrayList<String> parseJSON(String resp) {
//General.mensajes=new ArrayList<String>();
mensajes=new ArrayList<String>();
JSONObject total;
try {
total = new JSONObject(resp);
Log.i("JSON","Respuesta recibida: "+resp);
JSONObject paso1=new JSONObject(total.getString("chat"));
JSONArray paso2=new JSONArray(paso1.getString("mensajes"));
//JSONArray paso3=new JSONArray(paso2.getString("mensaje"));
for (int i=0;i<paso2.length();i++){
JSONObject jobj=paso2.getJSONObject(i);
mensajes.add(i,jobj.getString("mensaje"));
Log.i("JSON","Añadido objeto: "+paso2.getString(i));
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mensajes;
}
};
thread.start();
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i("CHAT", "ChatService destruido");
timer.cancel();
}
}
如您所见,我收到来自服务器的响应,解析 JSON,并返回一个包含所有消息的 ArrayList,它存储在一个 Singleton 类中,我在其中存储一些值(这就是 General.mensajes 的原因)。所有这些都发生在另一个 Activity 打开并执行其职责(发送 LatLng 对象)时。该 Activity 必须在用户收到新消息时做出反应,并打开聊天 Activity:
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try{
if(General.mensajes.size() > numerodemensajes && General.chatabierto==false){
Intent chat=new Intent(c, ChatActivity.class);
General.AzafataChat=false;
startActivity(chat);
}
}catch(Exception e){
e.printStackTrace();
}
numerodemensajes=General.mensajes.size();
}
}, 0, 10000);
在 ChatActivity 中,我有一个处理程序来响应新消息的到达,并分配 Adapter::
mHandler.post(new Runnable() {
public void run() {
madapter = new MessageAdapter(getApplicationContext(), 0, General.mensajes);
setListAdapter(madapter);
}
});
最后,适配器:
public class MessageAdapter extends ArrayAdapter {
private final Context context;
//private final ArrayList<Message> list;
private final ArrayList<String>list;
private Bitmap x;
String remitente;
String message;
String remite;
String mensaje;
private int numberOfItems;
@SuppressWarnings("unchecked")
public MessageAdapter(Context context, int textresourceViewid,
ArrayList<String> messages) {
super(context, textresourceViewid, messages);
this.context = context;
this.list = messages;
}
@Override
public int getCount() {
return this.list.size();
}
@Override
public Object getItem(int position) {
return this.list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
numberOfItems=list.size();
try {
message = list.get(position);
} catch (Exception e) {
// TODO Auto-generated catch block
//e.printStackTrace();
}
//ViewHolder holder=new ViewHolder();
if (v == null) {
if (message.split(":")[0].equals("personal")){
//holder=new ViewHolder();
Log.i("CHAT", "En la lista hay "+list.size()+" mensajes");
Log.i("CHAT", "El mensaje dice: "+list.get(0).split(":")[1]);
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.chatsenderlayout, null);
if (message != null) {
TextView texto=(TextView)v.findViewById(R.id.textaza);
texto.setText(message);
}
}else{
Log.i("CHAT", "Estamos en el else");
//holder=new ViewHolder();
LayoutInflater vi = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.chatazafatalayout, null);
if (message != null) {
TextView texto=(TextView)v.findViewById(R.id.textaza);
texto.setText(message);
}
}
}
return v;
}
public int getLastIndex() {
int last = 0;
if (!list.isEmpty()) {
last = list.size() - 1;
}
return last;
}
}
毕竟,问题是:
当 ChatActivity 打开时,它只显示最后 5 条消息...重复,我的意思是:如果 ArrayList 中有 12 条消息,则 ChatActivity 显示 12 条消息,但只显示最后 5 条消息:8、9、10、11, 12、8、9、10、11、12、8、9。
我对此感到生气......我认为它应该可以正常工作,但事实并非如此。任何人都可以帮助我吗?
我知道这有点(或很多......)混乱。如果你不明白的东西随时问。
非常感谢。