Проблема с вызовом jsonParser.makeHttpRequest из службы Android при закрытии приложения - PullRequest
0 голосов
/ 24 апреля 2019

В моем приложении для Android есть служба, которая все еще работает, даже если мое приложение закрыто. Эти службы используют jsonParser.makeHttpRequest (в отдельном потоке) для периодического чтения некоторых данных с сервера mySQL благодаря PHP-скрипту, расположенному на сервере.

  1. Когда приложение открыто, jsonParser получает данные с сервера
  2. Когда приложение скрыто, jsonParser получает данные с сервера
  3. Когда приложение закрыто, jsonParser не получает данные с сервера (служба все еще работает).

Я получаю сообщение об ошибке такого типа: «HttpHostConnectException: соединение с www ...... отказано»

Это выглядит как проблема с подключением к сервисной сети после закрытия приложения.

До сих пор я не нашел причину этой проблемы, даже если многие сайты были проверены мной.


Запуск службы из MainActivity:

startService(new Intent(getBaseContext(), ServicePowiadomienia.class));

Класс обслуживания:

package com.kamitosoft.meforyou;
import android.app.AlarmManager;
import android.app.IntentService;
import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.IBinder;
import android.support.annotation.Nullable;
import android.text.format.DateUtils;
import android.util.Log;
import android.widget.Toast;


import java.util.Calendar;
import java.util.Timer;
import java.util.TimerTask;

public class ServicePowiadomienia extends Service {


    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {


        AlarmManager mgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent i = new Intent(this, AlarmBroadcastReceiver.class);
        i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        PendingIntent pi = PendingIntent.getBroadcast(this, 0, i, PendingIntent.FLAG_CANCEL_CURRENT);
        //mgr.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + 10800000, 21600000, pi);
        mgr.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + 30000, 30000, pi);

        return START_STICKY;
    }
    @Override
    public void onDestroy() {
        super.onDestroy();
        //Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
    }


}

Класс AlarmBrodcastReceiver:

public class AlarmBroadcastReceiver extends BroadcastReceiver {

    DataBaseOperations dbOperations = new DataBaseOperations();
    DataBasePHP dbOperationsPHP = new DataBasePHP();
    Context contextGlobal;


    @Override
    public void onReceive(Context context, Intent intent) {

        contextGlobal = context;
        new pobierzPowiadomieniePush().execute();
        Log.d("pushA", "pushA");
    }


    //Wątek pobierający zawartość listy
    private class pobierzPowiadomieniePush  extends AsyncTask<Void, Void, DataBaseOperations.PowiadomieniePush> {

        int idPoprzedniParentKatalog = 0;
        ProgressDialog dialog = null;

        @Override
        protected void onPreExecute() {


        }

        @Override
        protected DataBaseOperations.PowiadomieniePush doInBackground(Void... arg0) {

            Log.d("pushA2", "pushA2");
            DataBaseOperations.PowiadomieniePush odczytanePowiadomieniePush = new DataBaseOperations.PowiadomieniePush();
            odczytanePowiadomieniePush = dbOperationsPHP.getPowiadomieniePush(MyProperties.getInstance().userID, MyProperties.getInstance().softMode);

            return odczytanePowiadomieniePush;

        }

        @Override
        protected void onPostExecute( DataBaseOperations.PowiadomieniePush odczytanePowiadomieniePushX) {

            if(odczytanePowiadomieniePushX.status > 0) //Jest powiadomienie
            {
                wyswietlPowiadomieniePush(odczytanePowiadomieniePushX.tytul, odczytanePowiadomieniePushX.opis, contextGlobal);
            }

        }

    }



    private void wyswietlPowiadomieniePush(String tytulWiadomosci, String trescWiadomosci, Context context)
    {
        NotificationManager mNotificationManager =
                (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
        //////////
        ///////////////////
        // The id of the channel.
        String id = "my_channel_01";

        // The user-visible name of the channel.
        CharSequence name = "Name123";

        // The user-visible description of the channel.
        String description = "Description123";

        int importance = NotificationManager.IMPORTANCE_LOW;

        NotificationChannel mChannel = null;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mChannel = new NotificationChannel(id, name,importance);
            // Configure the notification channel.
            mChannel.setDescription(description);

            mChannel.enableLights(true);
            // Sets the notification light color for notifications posted to this
            // channel, if the device supports this feature.
            mChannel.setLightColor(Color.RED);

            mChannel.enableVibration(true);
            mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});

            mNotificationManager.createNotificationChannel(mChannel);
        }
        ///////////////////
        ////////
        Intent intent = new Intent(context, MainActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(context, 0, intent, 0);

        Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.aw001);

        int notifyID = 1;

        String CHANNEL_ID = "my_channel_01";

        // Create a notification and set the notification channel.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Notification notification = new Notification.Builder(context)
                    .setContentTitle(tytulWiadomosci)
                    .setContentText(trescWiadomosci)
                    .setSmallIcon(R.drawable.ic_launcher1)
                    .setChannelId(CHANNEL_ID)
                    .setContentIntent(pIntent)
                    .build();

            mNotificationManager.notify(notifyID, notification);
        }
    }



}

Функция подключения PHP:

public DataBaseOperations.PowiadomieniePush getPowiadomieniePush(int userID, int folderLevel2ID)
{
    Log.d("pushA3", "pushA3");
    DataBaseOperations.PowiadomieniePush powiadomieniePushInfo = new DataBaseOperations.PowiadomieniePush();
    JSONParser jsonParser = new JSONParser();
    //Url dodaj nowego uzytkownika
    String url = servURL + "get_powiadomienie_push.php";

    // Building Parameters
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("userID", Integer.toString(userID)));
    params.add(new BasicNameValuePair("folderLevel2ID", Integer.toString(folderLevel2ID)));
    // getting JSON Object
    // Note that create product url accepts POST method
    Log.d("pushA3111", "pushA31111");
    JSONObject json = jsonParser.makeHttpRequest(url,
            "POST", params);
    Log.d("pushA32222", "pushA322222");


    try {
        int success = json.getInt("success");
        Log.d("pushA4", Integer.toString(success));

        if(success == 1)
        {
            powiadomieniePushInfo.status = json.getInt("status");
            powiadomieniePushInfo.tytul = json.getString("temat");
            powiadomieniePushInfo.opis = json.getString("opis");
            Log.d("pushA5", powiadomieniePushInfo.tytul);
            Log.d("pushA6", Integer.toString(powiadomieniePushInfo.status));
        }
        else
        {
            Log.d("PHP Error", json.getString("message"));
        }

    } catch (JSONException e) {
        e.printStackTrace();
    }


    return powiadomieniePushInfo;
}

Все еще не работает, но в данный момент в Logcat я не могу найти ошибку:

04-24 22:17:09.842 28322-9669/? D/pushA3111: pushA31111
04-24 22:17:09.842 9317-9317/? D/SemContextManager:   .requestToUpdate : listener = com.samsung.android.app.shealth.tracker.pedometer.service.wrapper.ActivitySensorDelegator$SemContextListenerWrapper@3fbb4ae, service=Sensor Status Check
04-24 22:17:09.845 28322-9669/? I/System.out: Thread-2046(ApacheHTTPLog):isSBSettingEnabled false
    Thread-2046(ApacheHTTPLog):isShipBuild true
    Thread-2046(ApacheHTTPLog):getDebugLevel 0x4f4c
    Thread-2046(ApacheHTTPLog):Smart Bonding Setting is false
    Thread-2046(ApacheHTTPLog):SmartBonding Setting is false, SHIP_BUILD is true, log to file is false, DBG is false, DEBUG_LEVEL (1-LOW, 2-MID, 3-HIGH) is 1
04-24 22:17:09.848 4750-5045/? D/DnsProxyListener: DNSDBG::dns addrinfo af 2
04-24 22:17:09.855 4926-5515/? I/chatty: uid=1000(system) Binder:4926_5 identical 2 lines
04-24 22:17:09.858 4926-5515/? W/StorageManager: getStorageLowBytes lowPercent : 5, lowBytes : 1334851584, maxLowBytes : 524288000
04-24 22:17:09.866 4926-5144/? V/SamsungAlarmManager: Sending to uid : 10079 action=com.samsung.action.EVERY_MINUTE_CLOCK_UPDATE alarm=Alarm{de5faca type 1 when 1556137020000 com.sec.android.app.launcher}
04-24 22:17:09.869 6435-6435/? I/Launcher: onReceive: com.samsung.action.EVERY_MINUTE_CLOCK_UPDATE
04-24 22:17:09.877 4926-5515/? D/SamsungAlarmManager: setInexact Intent (T:1/F:0/AC:false) 20190424T221800 - CU:10079/CP:6435
04-24 22:17:09.878 6435-6435/? I/IconView: applyFromApplicationInfo - start GetLive : com.sec.android.app.clockpackage
04-24 22:17:09.881 4926-4956/? W/StorageManager: getStorageLowBytes lowPercent : 5, lowBytes : 1334851584, maxLowBytes : 524288000
04-24 22:17:09.883 6435-6435/? D/ApplicationPackageManager: we has com.sec.android.app.clockpackage class. reuse it 
04-24 22:17:09.883 6435-6435/? D/LiveIconLoader: getLiveIcon was called in ClockPackage
04-24 22:17:09.885 6435-6435/? D/LiveIconLoader: getLiveIcon res = com.sec.android.app.clockpackage
04-24 22:17:09.886 6435-6435/? D/LiveIconLoader: stdIconSize : 126 , targetIconSize : 141
04-24 22:17:09.887 6435-6435/? D/LiveIconLoader: mIconDpi : 480 , mTargetIconDpi : 420
04-24 22:17:09.896 6435-6435/? I/ApplicationPackageManager: load= live icon for com.sec.android.app.clockpackage, from overlay = false
04-24 22:17:09.898 6435-6435/? I/LiveIconManager: getLiveIcon: complete(sync_created)
04-24 22:17:09.898 6435-6435/? I/IconView: applyFromApplicationInfo - end GetLive : com.sec.android.app.clockpackage
04-24 22:17:09.904 9587-9645/? D/RenderScript HIDL Adaptation: IRenderScriptDevice::getService()
04-24 22:17:09.906 4926-6380/? D/SamsungAlarmManager: Cancel Alarm calling from uid:10000 pid :9587 / op:PendingIntent{7e17758: PendingIntentRecord{560b983 com.kakao.talk startService}}
04-24 22:17:09.908 4926-6380/? D/SamsungAlarmManager: Cancel Alarm calling from uid:10000 pid :9587 / op:PendingIntent{36cd0b1: PendingIntentRecord{6d0f996 com.kakao.talk startService}}
04-24 22:17:09.910 4926-6380/? D/SamsungAlarmManager: Cancel Alarm calling from uid:10000 pid :9587 / op:PendingIntent{30a2917: PendingIntentRecord{eb6adf com.kakao.talk startService}}
04-24 22:17:09.914 4926-6380/? D/SamsungAlarmManager: Cancel Alarm calling from uid:10000 pid :9587 / op:PendingIntent{2a2b104: PendingIntentRecord{eb6adf com.kakao.talk startService}}
04-24 22:17:09.920 4926-4956/? D/ConnectivityService: filterNetworkStateForUid() uid: 10000 networkInfo: [type: MOBILE[LTE] - MOBILE, state: CONNECTED/CONNECTED, reason: connected, extra: internet, failover: false, available: true, roaming: false, metered: true]
04-24 22:17:09.922 4926-5515/? D/ConnectivityService: filterNetworkStateForUid() uid: 10000 networkInfo: [type: MOBILE[LTE] - MOBILE, state: CONNECTED/CONNECTED, reason: connected, extra: internet, failover: false, available: true, roaming: false, metered: true]
04-24 22:17:09.926 4750-5045/? D/DnsProxyListener: DNSDBG::dns addrinfo af 2
04-24 22:17:09.955 9587-9606/? D/FA: Connected to remote service
04-24 22:17:09.961 9587-9606/? V/FA: Processing queued up service tasks: 1
04-24 22:17:09.968 4926-5515/? I/chatty: uid=1000(system) Binder:4926_5 identical 2 lines
04-24 22:17:09.970 4926-5515/? D/ConnectivityService: filterNetworkStateForUid() uid: 10000 networkInfo: [type: MOBILE[LTE] - MOBILE, state: CONNECTED/CONNECTED, reason: connected, extra: internet, failover: false, available: true, roaming: false, metered: true]
04-24 22:17:09.980 4926-4956/? D/ConnectivityService: filterNetworkStateForUid() uid: 10000 networkInfo: [type: MOBILE[LTE] - MOBILE, state: CONNECTED/CONNECTED, reason: connected, extra: internet, failover: false, available: true, roaming: false, metered: true]
04-24 22:17:10.022 9587-9645/? D/RenderScript HIDL Adaptation: IRenderScriptDevice::getService() returned 0xde66cc40
    HIDL successfully loaded.
04-24 22:17:10.046 9587-9683/? V/RenderScript: ARM mali (32 bit) RenderScript Compute Driver
04-24 22:17:10.069 9587-9683/? V/RenderScript: Successfully loaded runtime: libRSDriverArm.so
04-24 22:17:10.070 28322-9669/? I/System.out: AsyncTask #96 calls detatch()
04-24 22:17:10.070 28322-9669/? D/pushA32222: pushA322222
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...