1

我已经看到很多此类问题的答案,但与我的任务无关。我正在尝试在后台获取 gps 位置,但我遇到了异常,如Cant Create Handler Inside Thread That Has Not Called Looper Prepare in Android.mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);

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() 方法中调用它。

谢谢你们的帮助。

4

3 回答 3

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;    
                } 
     } 

通过让 Locationmanager 在onPreExecute()异常中摆脱我的应用程序。我们可以在 onpreexecute 而不是doinbackground().

于 2012-06-27T15:53:39.217 回答
3

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

在 doInBackground 调用中Looper.prepare();

所以你的代码会变成这样。

@Override
        protected Void doInBackground(Void... params) { 
            Looper.myLooper().prepare();
            boolean isGps = false;
            -----------------
于 2012-06-14T14:41:08.330 回答
1

这似乎适合我目前正在尝试做的事情。你有机会告诉我完整的来源吗?我目前已将其用于我的代码,但我想看看您如何获取 GPS 坐标并启动异步

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;
}






}
于 2012-10-02T21:03:16.870 回答