mkyong mkyong - 1 year ago 81
Java Question

Alert Dialog from Thread - Android

I have a thread that sends GPS coordinates to a database every six seconds and I have a check that verifies that the user is within a defined area. If the user is not within the location, I want an alert dialog that notifies them that they are out of range, and if they are within the area I want a dialog that tells them they are within range. I have the checks working properly, but I have tried and I'm pretty sure that I can't add the dialog on the background thread. I have read a bit about using handlers but I'm not sure how to implement one. If you have any suggestions I would appreciate it! Thanks.

This is how I call
from my main activity (

new FindLocation(getBaseContext()).start(usr_id1); //sends a user id with it

Below is

public class FindLocation extends Thread {

public boolean inJurisdiction;
public boolean AlertNotice = false;
private LocationManager locManager;
private LocationListener locListener;

Context ctx;
public String userId;

public FindLocation(Context ctx) {
this.ctx = ctx;

public void start(String userId) {
this.userId = userId;

public void run() {
final String usr = userId;

//get a reference to the LocationManager
locManager = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);

//checked to receive updates from the position
locListener = new LocationListener() {
public void onLocationChanged(Location loc) {

String lat = String.valueOf(loc.getLatitude());
String lon = String.valueOf(loc.getLongitude());

Double latitude = loc.getLatitude();
Double longitude = loc.getLongitude();

if (latitude >= 39.15296 && longitude >= -86.547546 && latitude <= 39.184901 && longitude <= -86.504288 || inArea != false) {
Log.i("Test", "Yes");

inArea = true;

JSONArray jArray;
String result = null;
InputStream is = null;
StringBuilder sb = null;

ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("id", usr));

//http post

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
Log.e("log_tag", "Error in http connection"+e.toString());

//convert response to string
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
sb = new StringBuilder();
sb.append(reader.readLine() + "\n");

String line="0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");

catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());


jArray = new JSONArray(result);
JSONObject json_data=null;
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
String ct_name = json_data.getString("phoneID");
Log.i("User ID", ct_name);
if(ct_name == usr) {
Log.i("User ID", "NONE");

catch(Exception e){
//Log.e("log_tag", "Error converting result "+e.toString());

HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("");

try {
List<NameValuePair> nameValuePairs1 = new ArrayList<NameValuePair>(2);
nameValuePairs1.add(new BasicNameValuePair("lat", lat));
nameValuePairs1.add(new BasicNameValuePair("lon", lon));
nameValuePairs1.add(new BasicNameValuePair("id", usr));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs1));
Log.i("SendLocation", "Yes");
catch (ClientProtocolException g) {
// TODO Auto-generated catch block
} catch (IOException f) {
// TODO Auto-generated catch block

else {
Log.i("Test", "No");
inArea = false;
public void onProviderDisabled(String provider){
public void onProviderEnabled(String provider){
public void onStatusChanged(String provider, int status, Bundle extras){
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 6000, 0, locListener);

Answer Source

It is a little difficult to read the entire code, but I will show you how to display an AlertDialog from a background Thread:

Create a handler inside onCreate(), or onResume()... something that runs on the UI-Thread:

      mHandler=new Handler();

Then inside your Thread() just use: Runnable() {
    public void run(){
        //Be sure to pass your Activity class, not the Thread
        AlertDialog.Builder builder = new AlertDialog.Builder(MyActivity.this);
        //... setup dialog and show