-1

I want to update my ChatMessageAdapter by received new data from background service so that I want to call UpdateAdapter method from background to update adapter.

here is my ServiceClass:

public class MyService extends Service{

private String loginUserInfoId;
SessionManager session;
DatabaseHelper db;
MessageListActivity mLA;

long totalSize = 0;

@Override
public void onCreate() {
    super.onCreate();
}

@Override
public void onDestroy() {
    super.onDestroy();
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    db = new DatabaseHelper(getApplicationContext());
    mLA = new MessageListActivity();

    session = new SessionManager(getApplicationContext());
    session.checkLogin();
    HashMap<String, String> user = session.getUserDetails();
    loginUserInfoId = user.get(SessionManager.KEY_USER_INFO_ID);

    if(isInternetOn()) {
        new syncMessageFromServer().execute();
        new SyncPendingMessageToServer();
    }


    return super.onStartCommand(intent, flags, startId);
}

@Override
public IBinder onBind(Intent arg0) {
    return null;
}

private class syncMessageFromServer extends AsyncTask<Void, Integer, String> {

    @Override
    protected void onPreExecute() {
        // setting progress bar to zero
        //progressBar.setProgress(0);
        super.onPreExecute();
    }

    @Override
    protected void onProgressUpdate(Integer... progress) {

    }

    @Override
    protected String doInBackground(Void... params) {
        return uploadFile();
    }

    @SuppressWarnings("deprecation")
    private String uploadFile() {
        String str = "";
        HttpResponse response;
        HttpClient myClient = new DefaultHttpClient();
        HttpPost myConnection = new HttpPost("http://192.168.1.2/AndroidApp/GetAllMessage/" + loginUserInfoId);

        try {
            response = myClient.execute(myConnection);
            str = EntityUtils.toString(response.getEntity(), "UTF-8");

        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            JSONArray jArray = new JSONArray(str);
            for (int i = 0; i <= jArray.length() - 1; i++) {
                JSONObject row = jArray.getJSONObject(i);
                ChatMessage cm = new ChatMessage();
                String offlineFileURL = "";

                /******* Firstly take data in model object ******/
                cm.setOriginalMsgThreadId(row.getString("MessageThreadId"));
                cm.setSenderUserInfoId(row.getString("SenderUserId"));                    cm.setReceiverUserInfoId(row.getString("MultipleReceiversId"));
                cm.setMessageStatus("SENT");
                cm.setIsPending(0);
                cm.setMessageText(row.getString("MessageText"));
                cm.setMediaURL(offlineFileURL);
                cm.setThumbImage(offlineFileURL);
                cm.setMediaMIMEType("");
                cm.setMediaSize(0);
                cm.setMediaName("");
                cm.setLatitude("");
                cm.setLongitude("");
                cm.setSendTimeStamp(row.getString("SendTime"));
                cm.setReceiveTimeStamp(row.getString("ReadTime"));

                mLA.UpdateAdapter(ChatMessage cm);

                long messageThreadId = db.SendMessage(cm);


            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return str;
    }
    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if(isInternetOn()) {
            new syncMessageFromServer().execute();
        }

    }
}

}

and this is my MessageActivityList Class:

public class MessageListActivity extends ActionBarActivity {

private String receiverUserInfoId;
private String loginUserInfoId;
private String orgMsgThreadId;
private String userName;
private String uploadedFileURL = "";

DatabaseHelper db;
SessionManager session;
private ChatMessageAdapter chatMessageAdapter;

private EditText chatText;
private ImageButton buttonSend;
private ListView listView;

private static final String TAG = MessageListActivity.class.getSimpleName();


// Camera activity request codes
private static final int CAMERA_CAPTURE_IMAGE_REQUEST_CODE = 100;
private static final int CAMERA_CAPTURE_VIDEO_REQUEST_CODE = 200;

public static final int MEDIA_TYPE_IMAGE = 1;
public static final int MEDIA_TYPE_VIDEO = 2;

private Uri fileUri; // file url to store image/video

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_message_list);

    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
            .detectAll()
            .penaltyLog()
            .build());

    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
            .penaltyLog()
            .build());

    db = new DatabaseHelper(getApplicationContext());

    session = new SessionManager(getApplicationContext());
    session.checkLogin();
    HashMap<String, String> user = session.getUserDetails();
    loginUserInfoId = user.get(SessionManager.KEY_USER_INFO_ID);

    Intent intent=getIntent();
    Bundle extra = intent.getExtras();
    receiverUserInfoId=extra.getString("UserInfoId");
    orgMsgThreadId = extra.getString("OrgMessageThreadId");
    userName=extra.getString("UserName");
    setTitle(userName);

    listView = (ListView) findViewById(R.id.messageList);
    chatMessageAdapter = new ChatMessageAdapter(getApplicationContext(), R.layout.activity_single_message);
    listView.setAdapter(chatMessageAdapter);

    buttonSend = (ImageButton) findViewById(R.id.buttonSend);
    chatText = (EditText) findViewById(R.id.chatText);
    chatText.setOnKeyListener(new View.OnKeyListener() {
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if ((event.getAction() == KeyEvent.ACTION_DOWN) && (keyCode == KeyEvent.KEYCODE_ENTER)) {
                if(chatText.getText().toString().trim().length() > 0){
                    sendChatMessage();
                }

            }
            return false;
        }
    });
    buttonSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            sendChatMessage();
        }
    });

    listView.setTranscriptMode(AbsListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
    // listView.setAdapter(chatMessageAdapter);

    //to scroll the list view to bottom on data change
    chatMessageAdapter.registerDataSetObserver(new DataSetObserver() {
        @Override
        public void onChanged() {
            super.onChanged();
            listView.setSelection(chatMessageAdapter.getCount() - 1);
        }
    });
    setListData();
}

public void UpdateAdapter(ChatMessage cm) {
            chatMessageAdapter.add(cm);
    }
}

What to do for calling this UpdateAdapter method to update my ChatMessage received by the server?

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Neeraj Mehta
  • 1,675
  • 2
  • 22
  • 45
  • [using-a-broadcast-intent-broadcast-receiver-to-send-messages-from-a-service-to-a](http://stackoverflow.com/questions/7276537/using-a-broadcast-intent-broadcast-receiver-to-send-messages-from-a-service-to-a), [tutorials/AndroidBroadcastReceiver](http://www.vogella.com/tutorials/AndroidBroadcastReceiver/article.html) should help – Pararth Feb 19 '15 at 06:14
  • will u please give me a source code for that. i dn't knw about BroadcastReciever @user2450263 – Neeraj Mehta Feb 19 '15 at 06:18
  • plz do it in this code – Neeraj Mehta Feb 19 '15 at 06:19
  • if you don't know BroadcastReceiver then reading about it is a better solution – Pararth Feb 19 '15 at 06:20
  • i dn't have much time coz i have to deliver this till eve please help @user2450263 – Neeraj Mehta Feb 19 '15 at 06:22

4 Answers4

0

You should be using a LocalBroadcastReceiver.

Register for receiving the updates in onResume and unregister in onPause.

Aditya Gupta
  • 508
  • 3
  • 18
0

U can use Broadcast receiver for updating the UI from service.

Register the broadcast receiver in onCreate() of ur Activity:

private UpdateReceiver updateReceiver;
 if (UpdateReceiver == null) 
 {
     updateReceiver = new UpdateReceiver();
     IntentFilter intentFilter = new  
                     IntentFilter("REFRESH_DATA");    
     registerReceiver(updateReceiver, intentFilter);
 }

Unregister in onDestroy() of ur Activity

if (updateReceiver != null) unregisterReceiver(updateReceiver);

Define the Broadcast receiver in ur Activity :

private class UpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("REFRESH_DATA")) {
      //update adapter from here
    }
  }
} 

In ur service in which situation u want to update the adapter, there call sendBroadcast. Like:

Intent intent=new Intent("REFRESH_DATA");
//u can pass the data through putExtras
sendBroadcast(intent);
user543
  • 3,623
  • 2
  • 16
  • 14
  • How can i send ChatMessage with intent – Neeraj Mehta Feb 19 '15 at 07:23
  • u can send object through intent like intent.putExtras(key, object), but the chatmessage should be serializable or parcelable. – user543 Feb 19 '15 at 07:48
  • i have sent data like long messageId = db.SendMessage(cm); Intent intent=new Intent("REFRESH_DATA"); intent.putExtra("id", messageId); sendBroadcast(intent); and recieving as if (intent.getAction().equals("REFRESH_DATA")) { intent=getIntent(); Bundle extra = intent.getExtras(); int chatMessageId = extra.getInt("id"); } but it isn't recieving the value – Neeraj Mehta Feb 19 '15 at 10:12
  • u r sending long value through putExtras, So, u will get the result using extra.getLong("id") not getInt – user543 Feb 19 '15 at 10:31
0

use Broadcast receiver for updating the UI from service and register the broadcast receiver in onCreate() of ur MainActivity where you want to recieve

code will like below

private UpdateReceiver updateReceiver;
 if (UpdateReceiver == null) 
 {
     updateReceiver = new UpdateReceiver();
     IntentFilter intentFilter = new  
                     IntentFilter("REFRESH_DATA");    
     registerReceiver(updateReceiver, intentFilter);
 }

and create class to check update is recieved or not

    private class UpdateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals("REFRESH_DATA")) {
      //update adapter from here
    }
  }
} 
Vipswelt
  • 345
  • 1
  • 2
  • 6
-1

register a BroadcastReceiver inside your activity. call that method in onReceive method of this receiver. and from your Service sendBroadcast to this receiver, remember to add the required data to your intent and fetch data from onReceive method intent.

Amrut Bidri
  • 6,276
  • 6
  • 38
  • 80