来自线程的警报对话 – Android

我有一个线程,每隔六秒就会将GPS坐标发送到一个数据库,我有一个检查,用于validation用户是否在一个已定义的区域内。 如果用户不在该位置,我想要一个警告对话框,通知他们他们超出范围,如果他们在该区域内,我想要一个告诉他们在范围内的对话框。 我检查工作正常,但我已经尝试过,我很确定我无法在后台线程上添加对话框。 我已经阅读了一些关于使用处理程序的内容,但我不确定如何实现它。 如果您有任何建议我会很感激! 谢谢。

这就是我从主活动( MainActivity.java )调用FindLocation.java

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

下面是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 nameValuePairs = new ArrayList(); 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 nameValuePairs1 = new ArrayList(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(); } } 

阅读整个代码有点困难,但我将向您展示如何从后台Thread显示AlertDialog

onCreate()onResume()创建一个处理程序…在UI-Thread上运行的东西:

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

然后在你的Thread()里面使用:

 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 } }); 
  runOnUiThread(new Runnable() { public void run() { //your alert dialog here.. } }); 
 new Handler().post(new Runnable{ public void run(){ //create your AlertDialog here.. } }); 

在这里看到更多