【问题标题】:IntentService lost work in executorIntentService 在执行程序中丢失了工作
【发布时间】:2018-04-25 14:41:12
【问题描述】:

我有一个执行者下载文件的课程:

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) 来处理我下载的长时间处理。我的执行程序类在 switch 命令中像这样处理 intentService:

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 类是:

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 是因为它会在停止之前完成所有进程?
我做错了什么?
谢谢

【问题讨论】:

    标签: android intentservice android-intentservice


    【解决方案1】:

    错误来源是 myService.setData(mydata>250ko) 中的数据大小。对于超过 250 ko 的所有数据,服务将停止并显示此错误消息:

    A/ActivityManager:使用 onDestroy 完成服务,但 executeNesting=2: 服务记录{5c8e958 u0 com.alit.aws.android.eworkpermit/.lib.TraitementPermisLoaded

    还有另一种方法可以将超过 250 k 的大数据传递给我的 intentService 吗?我试过了:
    ->mServiceIntent.setData(Uri.parse(responseData)); ->mServiceIntent.putExtra("myData",responseData);

    【讨论】:

      【解决方案2】:

      我找到了解决方案,删除“setData(responseData)”并将其替换为 globalHasMap。治疗结束后,我删除了 hashMap 中的项目。
      可能不是很棒,但我还没有找到更好的解决方案。 如果有人可以告诉我一个更好的方法,那就去做吧;-)
      谢谢

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-26
        • 2021-06-26
        • 1970-01-01
        • 2012-07-21
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多