由于获取GPS/Geo位置,主UI挂起



我试图在应用程序启动时获取用户的GPS/GeoLocation,但有时会导致应用程序UI没有响应,然后著名的Android提示应用程序没有响应!所以我决定尝试AsyncTask来获取用户在Main Activity中的位置信息;但有时UI仍然会挂起(通常是当gps设置被禁用时,所以我转到系统设置来启用它,当我按下返回到我的应用程序时,它会变得很慢/没有响应。)那么我在这里做错了什么?任何帮助都将不胜感激。

我的网络类应该得到定位的东西:

package com.parspake.kookojapost;
import android.content.Context;
import android.location.*;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Looper;
import android.util.Log;
import android.widget.Toast;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
public class ConnectionHandler {
private Context ctx;
double mLat;
double mLong;
String currCity;
String currCountry;
String mAddress;
LocationManager currentLoc;
LocationListener locLis;
public ConnectionHandler(Context context) {
    this.ctx = context;
}
public boolean internetAccess() {
    ConnectivityManager con = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = con.getActiveNetworkInfo();
    // Simplified: return netInfo != null && netInfo.isConnected();
    if (netInfo != null && netInfo.isConnected()) {
        return true;
    } else {
        return false;
    }
}
public boolean locationSourceEnabled() {
    currentLoc = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
    boolean isInternetLocationAvailable = currentLoc.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
    boolean isGpsAvailable = currentLoc.isProviderEnabled(LocationManager.GPS_PROVIDER);
    if (isInternetLocationAvailable) {
        Log.d("kookojaPost", "internet location avaiable");
        return true;
    } else if (isGpsAvailable) {
        Log.d("kookojaPost", "gps location avaiable");
        return true;
    }
    return false;
}
public void getLocation() {
    locLis = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {

            Geocoder gcd = new Geocoder(ctx, Locale.getDefault());
            List<Address> addresses;
            try {
                addresses = gcd.getFromLocation(location.getLatitude(), location.getLongitude(), 1);
                if (addresses.size() > 0) {
                    currCity = addresses.get(0).getLocality();
                    currCountry =  addresses.get(0).getCountryName();
                    mAddress = currCity + " - " + currCountry;
                }
            } catch (IOException e) {
//                    e.printStackTrace();
                    Log.d("kookojaPost", e.getMessage());
                }
                String s = "Loction: n" + mAddress;
            Toast.makeText(ctx, s, Toast.LENGTH_LONG).show();
            Toast.makeText(ctx, "Location GPS: " + location.getLatitude() + " - " + location.getLongitude(), Toast.LENGTH_LONG).show();
            mLat = location.getLatitude();
            mLong = location.getLongitude();
        }
        @Override
        public void onStatusChanged(String s, int i, Bundle bundle) {
        }
        @Override
        public void onProviderEnabled(String s) {
        }
        @Override
        public void onProviderDisabled(String s) {
        }
    };
    currentLoc = (LocationManager) ctx.getSystemService(Context.LOCATION_SERVICE);
    if (locationSourceEnabled()) {
        if (currentLoc.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
            currentLoc.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 50, locLis, Looper.getMainLooper());
        }
        if (currentLoc.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
            currentLoc.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 50, locLis, Looper.getMainLooper());
        }
    }
 }
}

这是我的主要活动,我在这里使用AsyncTask来做后台工作,但显然没有做它应该做的事情!

package com.parspake.kookojapost;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.location.Location;
import android.media.ThumbnailUtils;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.preference.PreferenceManager;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.Toast;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Calendar;
public class MainAct extends Activity {
ProgressBar pg;
ConnectionHandler mNet;
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    pg = (ProgressBar) findViewById(R.id.progressBar);
    mNet = new ConnectionHandler(this);
//        pg.setIndeterminate(true);
//        pg.setVisibility(View.VISIBLE);

//        new FetchLocation().execute();
}
@Override
protected void onResume() {
    super.onResume();
    new FetchLocation().execute();
}

private class FetchLocation extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pg.setVisibility(View.VISIBLE);
    }
    @Override
    protected Void doInBackground(Void... params) {
        if (mNet.locationSourceEnabled()) {
            Log.d("kookojaPost","mLat is: " + mNet.mLat);
//               while (mNet.mLat == 0.0) {
//                   mNet.getLocation();
//               }
            if (mNet.mLat == 0.0) {
                mNet.getLocation();
            }
        }
        return null;
    }
    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        pg.setVisibility(View.INVISIBLE);
    }
 }
}

我用这段代码解决了这个问题,而没有使用AsyncTask:

希望它对他人有用。

    Runnable runThis = new Runnable() {
        @Override
        public void run() {
            Looper.prepare();
            if (mNet.locationSourceEnabled()) {
                mNet.getLocation();
            }
            Looper.loop();
        }
    };
    Thread th = new Thread(runThis);
    th.start();

最新更新