2012-04-03 4 views
1

Ich habe einen Thread, der GPS-Koordinaten alle sechs Sekunden an eine Datenbank sendet, und ich habe eine Überprüfung, die überprüft, ob der Benutzer in einem definierten Bereich ist. Wenn sich der Benutzer nicht innerhalb des Standorts befindet, möchte ich einen Alarmdialog, der sie benachrichtigt, dass sie sich außerhalb des Bereichs befinden. Wenn sie sich in dem Bereich befinden, möchte ich einen Dialog, der ihnen sagt, dass sie sich in Reichweite befinden. Ich habe die Überprüfungen richtig, aber ich habe versucht und ich bin ziemlich sicher, dass ich den Dialog auf dem Hintergrundthread nicht hinzufügen kann. Ich habe ein wenig über die Verwendung von Handlern gelesen, aber ich bin mir nicht sicher, wie man eine implementiert. Wenn Sie irgendwelche Vorschläge haben, würde ich es schätzen! Vielen Dank.Alarmdialog von Thread - Android

Dies ist, wie ich FindLocation.java von meiner Haupttätigkeit nennen (MainActivity.java):

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

Unten ist FindLocation.java

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; 
     super.start(); 
     } 

@Override 
public void run() { 
    Looper.prepare(); 
    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 
       try{ 

        HttpClient httpclient = new DefaultHttpClient(); 
        HttpPost httppost = new HttpPost("http://www.example.com/test/example.php");  
        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 
       try{ 
         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"); 
         } 
         is.close(); 
         result=sb.toString(); 
         } 

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


         } 

       try{ 
         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) { 
           locManager.removeUpdates(locListener); 
          } 
          else{ 
           locManager.removeUpdates(locListener); 
           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("http://example.com/test/example.php"); 

          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)); 
            httpclient.execute(httppost); 
            Log.i("SendLocation", "Yes"); 
          } 
          catch (ClientProtocolException g) { 
           // TODO Auto-generated catch block 
          } catch (IOException f) { 
           // TODO Auto-generated catch block 
           e.printStackTrace(); 
          } 
       } 
      } 

      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); 
    Looper.loop(); 
} 
} 

Antwort

9

Es ist ein wenig schwierig, den gesamten Code zu lesen, aber ich werde Ihnen zeigen, wie ein AlertDialog von einem Hintergrund angezeigt Thread:

einen Handler erstellen innerhalb onCreate() oder onResume() ... etwas, das auf den UI-Thread läuft:

...onCreate(){ 
     //... 
     mHandler=new Handler(); 
} 

Dann in Ihrem Thread() nur verwenden:

mHandler.post(new 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 
    } 
}); 
+0

Ich verstehe das, aber ich nenne dies aus meiner Haupttätigkeit und die gesamte Klasse ist im Wesentlichen ein Thread. Da ich kein onCreate für die Klasse habe, wo würde ich das Handler-Objekt instanziieren? – mkyong

+0

Sie könnten es einfach als Parameter im Konstruktor Ihres Threads übergeben. genauso wie du den Kontext passierst. –

2
new Handler().post(new Runnable{ 
public void run(){ 

    //create your AlertDialog here.. 
    } 

}); 

mehr sehen here

8
 runOnUiThread(new Runnable() { 
        public void run() { 

           //your alert dialog here.. 

        } 
       }); 
+0

Wo würde ich dies in der Klasse findlocation setzen? Wie nenne ich es? Würde ich das zweimal verwenden, wenn der Benutzer sich innerhalb des definierten Standorts befindet und wenn dies nicht der Fall ist? Danke – mkyong

+0

siehe ... wann immer du den alertdialog anzeigen willst .. setze das ganze Teil dort .. und erstelle den Alarmdialog innerhalb .. – 5hssba

+0

Ok ich sehe. Ich habe das gemacht, aber ich bekomme einen Fehler 'Die Methode runOnUiThread (new Runnable() {}) ist nicht definiert für den Typ new LocationListener() {}', wenn ich es direkt unter 'inArea = true;' (nach dem if (Latitude> = ...)) Irgendeine Idee warum? – mkyong