Android:尝试将位置查找器和截击请求移动到服务中

时间:2013-12-08 00:16:44

标签: android

我对Android有点新意,我试图将一些位置查找和排球方法从我的片段中移到服务中,但现在确定在哪里放什么。它基本上是一个天气应用程序,可以获取您当前的位置,并使用volley来提取forecast.io api数据。

现在是我的片段:

public class WeatherListFragment extends ListFragment implements LocationListener {

private final String initialURL = "https://api.forecast.io/forecast/8fc2b0556e166fa4670d4014d318152a/";
Weather[] myWeatherArray = {};
Weather myWeatherObject;
WeatherAdapter weatherAdapter;
LocationManager mLocationManager;
String currentLoc;
JSONArray data;
JSONObject day;


@Override
    public void onLocationChanged(Location location) {
        // Called when a new location is found by the network location provider.
        makeUseOfNewLocation(location);
        // Remove the listener you previously added
        mLocationManager.removeUpdates(this);
    }
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mLocationManager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE);

    makeUseOfNewLocation(mLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER));
    mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1, 1, this);
    mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, this);


}


public void getData() {

    String API_URL = setLatLong(initialURL, currentLoc);

    RequestQueue requestQueue = Volley.newRequestQueue(getActivity());

    JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, API_URL, null, new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {

            try {
                JSONObject daily = response.getJSONObject("daily");
                data = daily.getJSONArray("data");
                myWeatherArray = new Weather[data.length()];
                for (int i = 0; i < myWeatherArray.length; i++) {
                    day = data.getJSONObject(i);
                    myWeatherObject = new Weather();
                    myWeatherObject.setmDate(day.getInt("time"));
                    myWeatherObject.setmTempMin(day.getInt("temperatureMin"));
                    myWeatherObject.setmTempMax(day.getInt("temperatureMax"));
                    myWeatherObject.setIcon(day.getString("icon"));
                    myWeatherArray[i] = myWeatherObject;

                }

            } catch (JSONException e) {
                e.printStackTrace();
            }
            if (weatherAdapter != null) {
                weatherAdapter.setData(myWeatherArray);
            }
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(getActivity(), "volley died", Toast.LENGTH_SHORT).show();
        }
    }
    );
    requestQueue.add(jsonObjectRequest);
}

public void makeUseOfNewLocation(Location location) {

    if (location == null) {
        return;
    }

    mLocationManager.removeUpdates(this);

    double latDouble = location.getLatitude();
    double longDouble = location.getLongitude();

    String latString = String.valueOf(latDouble);
    String longString = String.valueOf(longDouble);

    String latLong = latString + "," + longString;
    Log.e("gps", latLong);
    currentLoc = latLong;

    getData();

}

public String setLatLong(String roughURL, String loc) {

    return roughURL + loc;

}

这是使用Handler的空白Service类:

public class NotificationService extends Service {

private Looper mServiceLooper;
private ServiceHandler mServiceHandler;

// Handler that receives messages from the thread
private final class ServiceHandler extends Handler {
    public ServiceHandler(Looper looper) {
        super(looper);
    }
    @Override
    public void handleMessage(Message msg) {
        // Normally we would do some work here, like download a file.
        // For our sample, we just sleep for 5 seconds.
        long endTime = System.currentTimeMillis() + 5*1000;
        while (System.currentTimeMillis() < endTime) {
            synchronized (this) {
                try {
                    wait(endTime - System.currentTimeMillis());
                } catch (Exception e) {
                }
            }
        }
        Notification n = new Notification(getApplicationContext());
        // Stop the service using the startId, so that we don't stop
        // the service in the middle of handling another job
        stopSelf(msg.arg1);
    }
}

@Override
public void onCreate() {
    // Start up the thread running the service.  Note that we create a
    // separate thread because the service normally runs in the process's
    // main thread, which we don't want to block.  We also make it
    // background priority so CPU-intensive work will not disrupt our UI.
    HandlerThread thread = new HandlerThread("ServiceStartArguments",
            Thread.MIN_PRIORITY);
    thread.start();

    // Get the HandlerThread's Looper and use it for our Handler
    mServiceLooper = thread.getLooper();
    mServiceHandler = new ServiceHandler(mServiceLooper);
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();


    // For each start request, send a message to start a job and deliver the
    // start ID so we know which request we're stopping when we finish the job
    Message msg = mServiceHandler.obtainMessage();
    msg.arg1 = startId;
    mServiceHandler.sendMessage(msg);

    // If we get killed, after returning from here, restart
    return START_STICKY;
}

@Override
public IBinder onBind(Intent intent) {
    // We don't provide binding, so return null
    return null;
}

@Override
public void onDestroy() {
    Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
    }
}

0 个答案:

没有答案