2012-06-14 136 views
1

我已经看到了很多这类问题的答案,但它与我的任务无关。我想要在后台获得GPS位置,但我得到了Cant Create Handler Inside Thread That Has Not Called Looper Prepare in AndroidmlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);的例外。如何使用AsyncTask获取GPS位置?

public class GPSLocation extends AsyncTask<Void, Void, Void> 
    { 
     @Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 
      progressDialog = new ProgressDialog(RoadMaintenanceActivity.this); 
      progressDialog.setCancelable(true); 
      progressDialog.setMessage("Getting GPS Location..."); 
      progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      progressDialog.setProgress(1); 
      progressDialog.show(); 

     } 
     @Override 
     protected void onProgressUpdate(Void... values) { 
      super.onProgressUpdate(values); 
      // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog 
     } 

     @Override 
     protected void onPostExecute(Void result) 
     { 

       progressDialog.cancel(); 
     } 
     @Override 
     protected Void doInBackground(Void... params) { 

      boolean isGps = false; 

      while(!isGps) 
      { 
       LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
       LocationListener mlocListener = new MyLocationListener(); 
       mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener); 
       if(longitude !=0 && latitude!=0) 
       { 
        isGps = true; 
        sendSMS(); 
       } 
      } 

      return null; 


     } 

    } 

我不知道为什么我们不能在doBackground()方法中调用它。

感谢您的帮助球员。

回答

5

最后我想通了这个问题,我认为这将帮助一些人喜欢我

public class GPSLocation extends AsyncTask<Void, Void, Void> 
    { 
     boolean running =true; 
       @Override 
       protected void onPreExecute() 
       { 
        super.onPreExecute(); 
        progressDialog = new ProgressDialog(RoadMaintenanceActivity.this); 
        progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ 
          public void onCancel(DialogInterface dialog) { 
           getgps.cancel(true); 
          } 
        }); 
        LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
        LocationListener mlocListener = new MyLocationListener(); 
        mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);  
        progressDialog.setCancelable(true); 
        progressDialog.setMessage("Getting GPS Location..."); 
        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
        progressDialog.setProgress(1); 
        progressDialog.show(); 

       } 

       @Override 
       protected void onProgressUpdate(Void... values) { 
        super.onProgressUpdate(values); 
        // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog 
       } 

       @Override 
       protected void onPostExecute(Void result) 
       { 
         progressDialog.cancel(); 
       } 

       @Override 
       protected Void doInBackground(Void... params) { 
        boolean isDataSubmitted = false; 

        while(!isDataSubmitted) 
        { 
         if(longitude !=0 && latitude!=0) 
         { 
          sendSMS(); 
          isDataSubmitted = true; 
         } 
        } 

        return null;  
       } 
    } 

通过具有onPreExecute()的LocationManager异常从我的应用程序摆脱出来。我们可以通过onpreexecute获取gps,而不是doinbackground()

3

你不能这样做。mlocListener需要一个Looper线程来操作。

在doInBackground呼叫Looper.prepare();

所以你的代码会变得这样的事情。

@Override 
     protected Void doInBackground(Void... params) { 
      Looper.myLooper().prepare(); 
      boolean isGps = false; 
      ----------------- 
+0

谢谢您的回答其实我解决了这个问题。现在它的一个不同'SmsManager smsManager = SmsManager.getDefault(); \t \t \t \t \t \t \t \t \t \t smsManager.sendTextMessage(sms_phonenumber,NULL,消息,sentPI,NULL); '它说空指针异常..你有什么想法...谢谢 – GoCrazy

+0

你应该用你最近的错误创建一个新的问题,因为它很难解决我们看不到的问题。 – Guardanis

+0

@cruceo感谢您的评论..我已经解决了这个问题.. – GoCrazy

1

这似乎适合我现在要做的事情。任何机会,你可以告诉我完整的来源?目前,我有它的工作为我的代码,但我想看看你是如何得到GPS联合ORDS和启动异步

ProgressDialog progressDialog; 
double longitude, latitude; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_confirm_screen); 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    Boolean locationCheck = sp.getBoolean("LOCATION", false); 
    if(locationCheck){ 

    } 
    else 
    { 
    sendEmail(); 
    playSound(); 
    } 

} 

public class GPSLocation extends AsyncTask<Void, Void, Void> 
{ 
    boolean running =true; 
      @Override 
      protected void onPreExecute() 
      { 
       super.onPreExecute(); 
       progressDialog = new ProgressDialog(ConfirmScreen.this); 
       progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener(){ 
         public void onCancel(DialogInterface dialog) { 
          getgps.cancel(true); 
         } 
       }); 

       LocationManager mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
       LocationListener mlocListener = new MyLocationListener(); 
       mlocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mlocListener);  
       progressDialog.setCancelable(true); 
       progressDialog.setMessage("Getting GPS Location..."); 
       progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
       progressDialog.setProgress(1); 
       progressDialog.show(); 

      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
       super.onProgressUpdate(values); 
       // Things to be done while execution of long running operation is in progress. For example updating ProgessDialog 
      } 

      @Override 
      protected void onPostExecute(Void result) 
      { 
        progressDialog.cancel(); 
      } 

      @Override 
      protected Void doInBackground(Void... params) { 
       boolean isDataSubmitted = false; 

       while(!isDataSubmitted) 
       { 
        if(longitude !=0 && latitude!=0) 
        { 
         sendEmail(); 
         isDataSubmitted = true; 
        } 
       } 

       return null;  
      } 
} 


public void backHome(View view) 
{ 
    Intent intent = new Intent (this, MainScreen.class); 
    startActivity(intent); 
} 

// Method to start playing and looping a sound. 

public void playSound() 
{ 
    MediaPlayer clickSound = MediaPlayer.create(this, R.raw.warning); 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    Boolean soundCheck = sp.getBoolean("SOUND", false); 
    if (soundCheck) 
    { 
     clickSound.start(); 
    } 



}// method end 

public void sendEmail() 
{ 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    String nameValue = sp.getString("NAME", "failed to get name"); 
    String emailValue = sp.getString("EMAIL", "failed to get email"); 
    Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_EMAIL, new String[]{emailValue}); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Email sent from DON'T PANIC - A Chris O'Brien Project"); 
    i.putExtra(Intent.EXTRA_TEXT, "Hi there\n" + nameValue + " is in mortal danger. They didn't include co-ords as they assume you know where they are..\nKind Regards\nDon't Panic! \n\n\n"); 

    try 
    { startActivity(Intent.createChooser(i, "Send mail....")); 
    } 
    catch (android.content.ActivityNotFoundException ex){ 

     Toast.makeText(ConfirmScreen.this, "There are no email clients installed or set up", Toast.LENGTH_SHORT).show(); 
    } 
} 


public void sendEmail(String a, String b, String c) 
{ 
    SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); 
    String nameValue = sp.getString("NAME", "failed to get name"); 
    String emailValue = sp.getString("EMAIL", "failed to get email"); 
    Intent i = new Intent(Intent.ACTION_SEND); 
    i.setType("message/rfc822"); 
    i.putExtra(Intent.EXTRA_EMAIL, new String[]{emailValue}); 
    i.putExtra(Intent.EXTRA_SUBJECT, "Email sent from DON'T PANIC - A Chris O'Brien Project"); 
    i.putExtra(Intent.EXTRA_TEXT, "Hi there\n" + nameValue + " is in mortal danger. Please see the co-ords attached and run to their rescue!" + 
      " If you don't see any co-ords, they didn't check the box and assume you know where they are.\nKind Regards\nDon't Panic! \n\n\n" + 
      a + b + c); 

    try 
    { startActivity(Intent.createChooser(i, "Send mail....")); 
    } 
    catch (android.content.ActivityNotFoundException ex){ 

     Toast.makeText(ConfirmScreen.this, "There are no email clients installed or set up", Toast.LENGTH_SHORT).show(); 
    } 
} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.activity_confirm_screen, menu); 
    return true; 
} 






}