2017-02-10 19 views
0

Ну, я продумал эту проблему, и мне нужна помощь со стороны сообщества.Android выполняет ImageUpload в фоновом режиме и данные о намерениях доступа в обратном вызове

Я хочу загрузить изображения (5 изображений) на сервер, который в настоящее время выполняется в async-задаче приложения. Следовательно, загрузка может быть остановлена, когда пользователь закрывает приложение, поэтому я хочу выполнить эту операцию, используя IntentService.

Итак, я создал свою службу Intent для выполнения загрузки изображения.

public class ImageUploadService extends IntentService { 


    /** 
    * Creates an IntentService. Invoked by your subclass's constructor. 
    * 
    * @param name Used to name the worker thread, important only for debugging. 
    */ 
    public ImageUploadService(String name) {super(name);} 

    public ImageUploadService(){ 
     this(ImageUploadService.class.getName()); 
    } 


    @Override 
    protected void onHandleIntent(Intent intent) { 
     //todo perform long running image upload operation 

     KbUserService kbUserService = JacksonRestRequestBuilder 
       .setupUploadRestService(RestUrls.BASE_URL_CUSTOMER, true, 
         KbUserService.class, getApplicationContext()); 

     LinkedHashMap<String, Object> requestBody = new LinkedHashMap<>(); 


     Call<LinkedHashMap<String,Object>> call = kbUserService.uploadFile(requestBody); 

     call.enqueue(new KbCallback() { 
      @Override 
      public void failure(Map<String, Object> serverErrorResponse, String genericErrorMessage) { 
       //todo send notification that image upload failed and also send broadcast event that image upload failed. 
      } 

      @Override 
      public void success(Map<String, Object> successResponse) { 

       Map<String, Object> modelDataFromResponseAsMap = 
         ClientModelUtils.getModelDataFromResponseAsMap(successResponse); 
//     Log.i(NAME,"Background Image upload completed for "+msg.arg1); 
       String fileUrl = ClientModelUtils.getString(modelDataFromResponseAsMap, 
         ModelConstants.UserConstants.IMAGE_URL); 
       //todo send notification that image upload success and send broadcast that image upload success. 
//     uploadFileSuccess(fileUrl, profName); 
//     bean.setUploadInProgress(false); 
//     view.uploadFileSuccess(fileUrl,profName); 
      } 

      @Override 
      public void networkOrUnexpectedError(String message) { 
       //todo send notification that image upload failed and also send broadcast event that image upload failed. 
      } 
     }); 

    } 

    protected void showToast(final String msg){ 
     //gets the main thread 
     Handler handler = new Handler(Looper.getMainLooper()); 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       // run this code in the main thread 
       Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_SHORT).show(); 
      } 
     }); 
    } 


} 

Поэтому я отправляю широковещательную передачу в ответ на успешную реакцию на все зарегистрированные действия.

Я не в состоянии решить следующие проблемы,

1. Пусть, когда вышел из приложения и вернулся к деятельности, как знать, какие в настоящее время загрузки изображений?

2.How для доступа к данным в намерениях onHandleIntent() внутри обратного вызова ?, Потому что в намерении данных у меня есть информация о imageType так, когда запрос на успех я хочу отправить трансляцию с imageUrl и imageType.

ответ

0

Это может быть не идеальный ответ, но у меня обычно есть широковещательные приемники как на службе, так и на деятельности. Таким образом, они могут общаться друг с другом. Например, когда действие начинается снова, я отправляю широковещательную передачу службе, уведомляющей ее. Затем служба отправит широковещательную рассылку с ее информацией.

public class SomeService extends Service { 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     registerReceiver(receiver, new IntentFilter(SOME_SERVICE_ACTIONS)); 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 

     unregisterReceiver(receiver); 
    } 

    private BroadcastReceiver receiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      switch (intent.getIntExtra(SERVICE_COMMAND, 0)) { 
       case ACTIVITY_STARTED: 
        sendCallback(); 

       break; 
     } 
    }; 

} 
+0

Как определить текущие выполняемые задачи? а также как вы можете получить доступ к данным о намерениях внутри обратного вызова? – Manikanta

+0

Вы должны хранить свои данные о намерениях в качестве поля. Что касается текущей загружаемой задачи, вам придется посмотреть ее на библиотеку, которую вы используете. Если вы можете получить обратный вызов, вы сможете транслировать эту информацию. –

 Смежные вопросы

  • Нет связанных вопросов^_^