3

Я пытаюсь показать обратную связь, процент, из которого они загружали данные с сервера.Circle Progress Bar on Fragment не показывает прогресс

Поток идет что-то вроде этого:

LoginActivity - OnSuccess, вызовите Service для загрузки данных - в то время как Service работает, я уже переключил пользователя HomeActivity

HomeActivity -Этот деятельности макет содержит созданный фрагмент LoadingFragment -Существует метод в LoadingFragment, то есть subscribed, к событию, которое отправляет Service

Моя проблема заключается в том, что пользовательский интерфейс фрагмента не изменяется вообще, когда событие было отправлено.

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

Ниже мой Service:

@Override 
public int onStartCommand(Intent intent, int flags, final int startId) { 

    Integer id = intent.getIntExtra("id", 0); 
    //do sync here 
    Log.i(LOG_TAG, "Make rest call to retrieve all r for id: " + id); 
    mRestClient.getApiService().getR(id, new Callback<List<R>>() { 
     @Override 
     public void success(List<R> rResponse, Response response) { 
      Integer outstanding = routeResponse.size(); 
      Integer percentage; 
      LoadingEvent loadingEvent = new LoadingEvent(); 
      SyncEvent syncEvent = new SyncEvent(); 

      Log.i(LOG_TAG, "Callback success r"); 
      System.out.println("yohellotest"); 
      Log.i(LOG_TAG, "Begin insertion"); 

      DaoMaster daoMaster = MyApp.getDaoMaster(); 
      DaoSession session = daoMaster.newSession(); 
      SQLiteDatabase db = session.getDatabase(); 
      RDao rDao = session.getRDao(); 
      WDao wDao = session.getWDao(); 
      JDao jDao = session.getJDao(); 

      Log.i(LOG_TAG, "--Beginning Transaction--"); 
      //db.beginTransaction(); 
      try { 
       int counter = 0; 
       for(int i = 0; i < rResponse.size(); i++) { 
        R r = rResponse.get(i); 
        rDao.insert(r); 
        Log.i(LOG_TAG, "inserted r: " + r.getId()); 

        for(int j = 0; j < r.getW().size(); j++) { 
         W w = r.getW().get(j); 
         wDao.insert(w); 
         Log.i(LOG_TAG, "inserted w: " + w.getId()); 

         for(int k = 0; k < w.getJ().size(); k++) { 
          J j = w.getJ().get(k); 
          jDao.insert(j); 
          Log.i(LOG_TAG, "inserted j: " + j.getJId()); 
         } 
        } 
        counter += 1; 
        percentage = (int) Math.floor((double) counter/outstanding * 100); 
        loadingEvent.setPercentage(percentage); 
        bus.post(loadingEvent); 

       } 
       Log.i(LOG_TAG, "Finished inserting"); 
       //db.setTransactionSuccessful(); 
      } catch (Exception e) { 
       Log.i(LOG_TAG, "Exception happened " + e.getMessage().toString()); 
       System.out.println("yo something happened, but I don't know what"); 
      } finally { 
       Log.i(LOG_TAG, "--Closing transaction--"); 
       //db.endTransaction(); 

      } 

      syncEvent.setIsSuccess(true); 
      syncEvent.setStatus(200); 
      bus.post(syncEvent); 

     } 

     @Override 
     public void failure(RetrofitError error) { 
      Log.i(LOG_TAG, "Rest call failed for this api"); 
      System.out.println("failtests"); 

     } 

    }); 

    return START_STICKY; 
} 

Fragment Подписка Метод

@Subscribe 
public void loadingResponse(final LoadingEvent loadingEvent) { 
    Log.i(LOG_TAG, "Response from loading: " + loadingEvent.getPercentage()); 

    if(getActivity() == null) 
     return; 
    textTest.setText(loadingEvent.getPercentage().toString()); 
    getActivity().runOnUiThread(new Runnable() { 
     @Override 
     public void run() { 
      Log.i(LOG_TAG, "Updating ui for loading text" + loadingEvent.getPercentage().toString()); 
      mCircularProgressBar.setProgress(loadingEvent.getPercentage()); 
      textTest.setText(loadingEvent.getPercentage().toString()); 
     } 
    }); 

} 

Когда я просматриваю журналы, я вижу, все идет в порядке, но интерфейс не отражает его. Что мне здесь не хватает?

EDIT Забыл упомянуть. Я использую эту библиотеку для моего круга прогресс бар:

CircleProgressBar

EDIT

На сегодняшний день, я еще до сих пор, чтобы понять это. Я также заметил, что мой адаптер не обновляется, когда служба отправляет событие. Ранее context, используемый для startService(), был getApplicationContext() от LoginActivity. Я думал, что это может быть проблемой, поэтому я заменил его, чтобы получить экземпляр HomeActivity. Я думал, что увольнение службы из моего HomeActivity решило бы проблему, но я до сих пор получаю такие же результаты.

+0

«TextTest» показывает ожидаемое значение? – Roshan

+0

@Roshan 'textTest' также ничего не показывает. Он остается как значение по умолчанию, которое я задал как. 'textTest' - это« TextView »для всех, кто интересуется. –

+0

как насчет входа в метод 'run'? – Roshan

ответ

1

Хорошо, поэтому никто не пытался попытаться ответить на мой вопрос, но я понял это.

Я фактически переместился над частью документации класса Service и не знал, что он выполняется на главной теме. Чтобы исправить это, мне пришлось запустить AsyncTask для выполнения моей операции в фоновом режиме.

Единственное, что мне пришлось изменить в моей кодовой базе, было переместить исполняемый код из метода onStartCommand в AsyncTask. AsyncTask будет начато onStartCommand, и все должно работать нормально.

Мой код выглядит примерно так:

Service

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    DownloadTask downloadTask = new DownloadTask(); 
    downloadTask.execute(); 
    return START_STICKY; 
} 

private class DownloadTask extends AsyncTask<Void, Void, LoginEvent> { 
    @Override 
    protected LoginEvent doInBackground(Void... params) { 
      //Code here to run my operations 
      //Call api, insert to db, post events etc... 
      // 
    } 

    @Override 
    protected void onPostExecute(LoginEvent event) { 
      //run anything here you want to do after execution 
    } 
} 

Вы можете игнорировать мои LoginEvent, как это было что-то для моего автобуса событий, чтобы послать сообщение любому подписчикам.

Кроме того, имейте в виду, что если вы собираетесь изменить любые взгляды этого AsyncTask через bus, убедитесь, что абонент использует runOnUi выполнить, иначе вы поразите исключение во время выполнения, поскольку вы пытаетесь изменить вид от чего-то другого, кроме MainThread.

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

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