IntentService потерял работу у исполнителя - PullRequest
0 голосов
/ 25 апреля 2018

У меня есть класс для загрузки файлов исполнителем:

this.getFreshGoolgletoken(new CallBackTokenRefresh() {

        @Override
        public void getFreshGoogleToken(String token,String userEmail) {

            ArrayList<ExecuteSynchroneRequest> mesRequetes = new ArrayList<>();
            Intent mServiceIntent = new Intent(context, TraitementPermisLoaded.class);

            for (CollectionPermis permis : collectionPermis){
                // stocker les permis + les s3Key
                int revision = permis.revision;
                final String uuid = permis.uuid;
                Log.i(LOG_TAG,"synchro OnLoop permis num & revision  :"+uuid+"/"+revision);
                Map<String,String> params = new HashMap<>();
                params.put("uuid",uuid);
                params.put("revision",String.valueOf(revision));

                mesRequetes.add(new ExecuteSynchroneRequest(AwsEworkPermitsRoutes.PERMITS,params,context,token,apiClient,uuid,handler,mServiceIntent,callBack));
            }

            ExecutorService execute = Executors.newSingleThreadExecutor();



            for(Runnable r : mesRequetes){

                 execute.execute(r);

            }



            execute.shutdown();



        }

В этом методе у меня есть IntentService (mServiceIntent) для обработки длинных обработок в моей загрузке.Мой класс executor обрабатывает intentService следующим образом в команде switch:

case PERMITS:
                    if(mServiceIntent == null) break;

                    mServiceIntent.setData(Uri.parse(responseData));
                    mServiceIntent.putExtra("myHandler", new Messenger(handler));
                    mServiceIntent.putExtra("ptUuid", uuid);
                    context.startService(mServiceIntent);
                    break;

mServiceIntent Class:

public class TraitementPermisLoaded extends IntentService {


static final String LOG_TAG = "ewp-executor ";
SharedPreferences sharedPreferences;
Handler handler;

public TraitementPermisLoaded() {
    super("TraitementPermisLoaded");
    setIntentRedelivery(true);
    Log.i(LOG_TAG," service traitement permis called 2 ");
}

@Override
protected void onHandleIntent(Intent workIntent) {
    this.sharedPreferences = getApplicationContext().getSharedPreferences("DATA", Context.MODE_PRIVATE);
    // Gets data from the incoming Intent
    String responseData = workIntent.getDataString();
    Messenger messenger = null;
    String ptUuid = "";
    Bundle extras=workIntent.getExtras();
    if (extras!=null) {
        messenger=(Messenger)extras.get("myHandler");
        ptUuid = extras.getString("ptUuid");

    }
    String permisUuid = "";
    PtWrapper pt = null;
    try {

        ObjectMapper mapper = new ObjectMapper();
        pt = mapper.readValue(responseData, PtWrapper.class);

        HandleJson handleJson = HandleJson.getInstance(getApplicationContext());
        permisUuid = pt.getPermisTravailFormContext().permisTravail.uuid;
        if (permisUuid != null) {
            handleJson.writeInInterneFileSysteme(sharedPreferences.getString("email",null),pt, permisUuid);
        } else {
            throw new HandleJsonNoPermisException("le UUID est null on ne peut pas enregistrer ce permis");
        }

        handleJson.setKpi(pt);

        Message message = Message.obtain();
        Bundle bundle= new Bundle();
        bundle.putString("myevent", "un permis ok");
        message.setData(bundle);
        messenger.send(message);


    } catch (IOException e) {
        Log.i(LOG_TAG, e.getMessage());
        e.printStackTrace();

        Message message = Message.obtain();
        Bundle bundle= new Bundle();
        bundle.putString("error", ErrorsCodes.CODE_40.toString()+" / permit uuid : "+ptUuid);
        message.setData(bundle);
        try {
            messenger.send(message);
        } catch (RemoteException e1) {
            e1.printStackTrace();
            Log.i(LOG_TAG,"erreur messager : "+e1.getMessage());
        }

    } catch (HandleJsonNoPermisException e) {
        Log.i(LOG_TAG, e.getMessage());
        e.printStackTrace();
    } catch (RemoteException e) {
        Log.i(LOG_TAG,e.getMessage());
        e.printStackTrace();
    }catch(Exception e){
        Log.i(LOG_TAG,e.getMessage());
        e.printStackTrace();
    }

}

}

Я загружаю 27 файлов, но только 14 получают лечение, Intentservice перестает работать,похоже, что это происходит после изменения активности, но не уверен.После загрузки файлов я изменяю свою активность другим, но intentService получает все запросы в очереди.Я использовал IntentService, потому что он завершит работу всего процесса до остановки?
Что я сделал не так?
Спасибо

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Я нашел решение, удалил «setData (responseData)» и заменил его globalHasMap.После окончания лечения я удаляю элемент в hashMap.
Может быть, это не круто, но я не нашел лучшего решения.Если кто-то может показать мне лучший способ, сделай это; -)
Спасибо

0 голосов
/ 26 апреля 2018

источником ошибки является размер данных в myService.setData (mydata> 250ko).Для всех данных, превышающих 250 ko, служба останавливается с этим сообщением об ошибке:

A / ActivityManager: Служба выполнена с onDestroy, но executeNesting = 2: ServiceRecord {5c8e958 u0 com.alit.aws.android.eworkpermit / .lib.TraitementPermisLoaded

Есть ли другой способ передать большие данные размером более 250 К в мой сервис intentService?Я попытался:
-> mServiceIntent.setData (Uri.parse (responseData));-> mServiceIntent.putExtra ( "MyData", responseData);

...