0

I am making an chat application while implementing it i need to update the messages automatically for this i am using asyntacks. For this i am having doubt that every time we cant able to refresh through asyntaks option. So, is there any way or any other method to refresh the chat activity for every second.

Chat.java

public class chatclass extends AsyncTask<String, Void, String> {

        @Override
        protected String doInBackground(String... params) {
            String receiverid = getIntent().getStringExtra("Rid");
            try {
                URL url = new URL("" + Constant.cht);
                Map<String, Object> paramm = new LinkedHashMap<>();
                paramm.put("sid", "" + Session.getUserID(getApplicationContext()));
                paramm.put("rid", "" + receiverid);
                StringBuilder postData = new StringBuilder();
                for (Map.Entry<String, Object> param : paramm.entrySet()) {
                    if (postData.length() != 0) postData.append('&');
                    postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
                    postData.append('=');
                    postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
                }
                String urlParameters = postData.toString();
                URLConnection conn = url.openConnection();
                conn.setDoOutput(true);
                OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
                writer.write(urlParameters);
                writer.flush();
                String result = "";
                String line;
                BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                while ((line = reader.readLine()) != null) {
                    result += line;
                }
                writer.close();
                reader.close();
                JSONObject response = new JSONObject(result);
                JSONArray array = response.getJSONArray("data");
                chatslistdata.clear();
                for (int i = 0; i < array.length(); i++) {
                    JSONObject chatobj = array.getJSONObject(i);
                    ChatBeanData chatBeanData = new ChatBeanData();
                    chatBeanData.setChat_id(chatobj.getString("chat_id"));
                    chatBeanData.setRid(chatobj.getString("rid"));
                    chatBeanData.setReciever_name(chatobj.getString("reciever_name"));
                    chatBeanData.setReciever_image(chatobj.getString("reciever_image"));
                    chatBeanData.setSid(chatobj.getString("sid"));
                    chatBeanData.setSender_name(chatobj.getString("sender_name"));
                    chatBeanData.setSender_image(chatobj.getString("sender_image"));
                    chatBeanData.setMessage(chatobj.getString("message"));
                    chatBeanData.setSeen_status(chatobj.getInt("seen_status"));
                    chatBeanData.setTime(chatobj.getString("time"));
                    chatslistdata.add(chatBeanData);
                }

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            chatadapter = new ChatAdapter(ChatsPage.this, chatslistdata);
            LinearLayoutManager mychatmanager = new LinearLayoutManager(ChatsPage.this, LinearLayoutManager.VERTICAL, false);
            mychatmanager.setStackFromEnd(true);
            chatlist.setLayoutManager(mychatmanager);
            chatlist.setAdapter(chatadapter);
            chatclass chatclass = new chatclass();
            chatclass.execute();

        }
    }

2 Answers2

1

It's really bad idea to refresh your chat every seconds because you lose a lot of server efficiency. You should do It like this:

  1. Download all messages from server,
  2. Download all messages with greater ID than last one message has (for example with long-polling or polling),
  3. If there is any message, update list.

Or use Soket.io for example, or weboskect.

Then:

  1. Create connection with server,
  2. Download all messages,
  3. Then server should send information if you will have new message,
  4. If you receive this information, download messages with greater ID than last one message has.

I thing, it is good idea for chat. Here you have demo of chat on socket.io

Have fun

Eliasz Kubala
  • 3,836
  • 1
  • 23
  • 28
0

It is not really good approach to refresh your chat every second to retrieve messages. This might overload your server with excessive requests which can be avoided.

To achieve real-time chat your server should send information if you have received any new messages.

On client-side you need to set a listener for that purpose. Once the listener is triggered, you can download the new messages.

Check ConnectyCube Android implementation as an example:

IncomingMessagesManager incomingMessagesManager = chatService.getIncomingMessagesManager();

incomingMessagesManager.addDialogMessageListener(new ChatDialogMessageListener() {
    @Override
    public void processMessage(String dialogId, ConnectycubeChatMessage message, Integer senderId) {

    }

    @Override
    public void processError(String dialogId, ChatException exception, ConnectycubeChatMessage message, Integer senderId) {

    }
});