【问题标题】:Android - Volley request throws ECONNREFUSED when App is closedAndroid - 当应用程序关闭时,Volley 请求抛出 ECONNREFUSED
【发布时间】:2019-01-31 18:42:15
【问题描述】:

我有一个运行intentservice 的警报管理器,它每分钟从服务器获取数据,然后发送通知。问题是当应用程序打开时我仍然可以获取数据,但如果应用程序关闭它会发送它抛出ECONNREFUSED

凌空错误:

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)

Android 5.1.1中测试

主要活动:

 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
}

广播接收器:

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

【问题讨论】:

  • 先生,请发布日志错误....您使用哪个 android 版本??
  • 我已经更新了帖子来回答你的问题。
  • 检查我的答案是否符合您的需要,将其标记为正确...如果您在实施过程中遇到任何困难,请告诉我

标签: android econnrefused


【解决方案1】:

intentservice 不能作为api 21 及更高版本的后台服务(应用程序关闭)..如果您只定位api 21 之后使用JobScheduler API...如果您定位Api 14 之后(Oreo 或 pre -Oreo)使用JobIntentService 作为它的现代方式。你的警报管理器应该触发broadcastreceiver,它会在时间到时启动服务。服务将获取数据并为此发送通知。

【讨论】:

  • 我已将intentservice 更改为JobIntentService,但仍会引发ECONNREFUSED 错误。
  • @ParralelUniverse 尝试检查您的互联网服务或对该请求使用改造..如果您发现我的答案有用,请将其标记为正确...ikonw 它解决的问题将在未来发生
  • 当应用程序关闭时,服务的互联网访问似乎被禁用。日志猫:I/MyJobIntentService: internet: false
  • 经过进一步测试,似乎在手机屏幕关闭时,互联网可用于服务,如果它处于连接状态,则连接被禁用。
  • @ParralelUniverse 如果答案符合您的需要,请将其标记为正确
猜你喜欢
  • 2017-06-13
  • 2017-06-08
  • 1970-01-01
  • 2020-05-29
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
相关资源
最近更新 更多