问题
I have an alarm manager that runs an intentservice
which fetch data from a server every minute and then sends a notification. Problem is when the app is opened i can still get the data but if the app is closed it sends it throws ECONNREFUSED
.
VOLLEY ERROR:
java.util.concurrent.ExecutionException:com.android.volley.NoConnectionError:
java.net.ConnectException: failed to connect to samples.openweathermap.org/138.201.197.100 (port 443) AFTER 2500ms: isConnected failed: ECONNREFUSED (Connection refused)
Testing in Android 5.1.1
Main Activity:
private void scheduleAlarm() {
Intent toastIntent= new Intent(getApplicationContext(),MyBroadcastReceiver.class);
PendingIntent toastAlarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, toastIntent,PendingIntent.FLAG_UPDATE_CURRENT);
long startTime=System.currentTimeMillis(); //alarm starts immediately
AlarmManager backupAlarmMgr=(AlarmManager)this.getSystemService(Context.ALARM_SERVICE);
backupAlarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP,startTime,1000*30,toastAlarmIntent); // alarm will repeat after every 15 minutes
}
Broadcast Receiver:
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
MyJobIntentService.enqueueWork(context,intent);
}}
MyJobIntentService:
public class MyJobIntentService extends JobIntentService {
private String status="";
public static void enqueueWork(Context context, Intent work) {
enqueueWork(context, MyJobIntentService.class, 1000, work);
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
RequestQueue requestQueue = Volley.newRequestQueue(getApplicationContext());
String url = "http://forsitefloodapp.xyz/Func/Func_GetFloodReportsBarangay";
RequestFuture<JSONArray> future = RequestFuture.newFuture();
JsonArrayRequest request = new JsonArrayRequest(url,future,future);
requestQueue.add(request);
try {
JSONArray response = future.get(10, java.util.concurrent.TimeUnit.SECONDS);
int size = response.length();
if(size==0){
status="NO REPORTS";
}
else {
status="REPORTS DETECTED";
}
} catch (InterruptedException e) { status="Interuppted";
} catch (ExecutionException e) { status=e.toString();
} catch (TimeoutException e) { status="Timeout";
}
Log.i("MyJobIntentService", "Completed service @ " + status);
//Sends notification
}}
回答1:
intentservice
will not work as background service (app closed) from api 21
and above ..if you just target api 21
onwards use JobScheduler API
...if you target Api 14
onwards(Oreo or pre-Oreo) use JobIntentService
as its the modernway.your alarm manager should trigger broadcastreceiver
which start the service when the time is up. service will fetch the data and send notification for that.
来源:https://stackoverflow.com/questions/52018770/android-volley-request-throws-econnrefused-when-app-is-closed