0

Это своего рода запутанное, поэтому, пожалуйста, несите меня. У меня есть объект, который имеет переменную экземпляра ImageView. Изображение, которое мне нужно прикрепить к объекту, хранится на сервере и будет меняться от экземпляра к экземпляру. Поэтому мне нужно получить его динамически.Служба Android, отслеживание объектов

Каждый объект получает экземпляр через метод onCreate() класса ListActivity. Чтобы получить соответствующее изображение сразу после создания экземпляра, у меня есть служба, роль которой заключается в загрузке правильного файла изображения с сервера. Он сохраняет изображение на SD-карте. Все идет нормально. Файл загружается правильно.

Здесь я застрял. Когда служба завершается, мне нужно связать объект, для которого я собирался получить файл, самому файлу. Чтобы добиться этого, я пытался передать сам объект в службу, а затем вернуться к BroadcastReceiver. проблема с этим подходом, я обнаружил, заключается в том, что всякий раз, когда я проходил по объекту, он передается по значению, а не по ссылке. Таким образом, создается новый объект, и след разрушается.

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

Заранее спасибо. Я знаю, что это странный вопрос. Надеюсь, я объяснил это достаточно хорошо.

От onCreate() в ListActivity:

//get the image for this workout type 
System.err.println("workout: " + workout); 
Intent intent = new Intent(context, DownloadPicture.class); 
intent.putExtra("workout", workout); 
intent.putExtra(DownloadPicture.FILENAME, filename); 
startService(intent); 
System.err.println("service started"); 

Служба

@Override 
protected void onHandleIntent(Intent intent) { 

    Workout callingObject = intent.getParcelableExtra("workout"); 
    System.err.println("onHandle workout: " + callingObject); //<--I can see that this is a different object by the pointer reference 
    String fileName = intent.getStringExtra(FILENAME); 
    String urlPath = this.getResources().getString(R.string.imagesURL) + fileName; 
    //download the file... 

private void publishResults(Workout callingObject, String fileName, String outputPath, int result) { 
    Intent intent = new Intent(NOTIFICATION); 
    intent.putExtra("workout", callingObject); 
    intent.putExtra(FILENAME, fileName); 
    intent.putExtra(FILEPATH, outputPath); 
    intent.putExtra(RESULT, result); 
    sendBroadcast(intent); 
    } 

А потом обратно в ListActivity, то BroadcastReceiver. Это создает нулевую ошибку указателя, так как объект «тренировки» равно нулю (если бы он был передан по ссылке не будет нулевым):

private BroadcastReceiver receiver = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      Bundle bundle = intent.getExtras(); 
      if (bundle != null) { 
       Workout workout = bundle.getParcelable("workout"); 
       String filePath = bundle.getString(DownloadPicture.FILEPATH); 
       int resultCode = bundle.getInt(DownloadPicture.RESULT); 
       if (resultCode == RESULT_OK) { 
        System.err.println("Download done: " + filePath); 
        System.err.println(workout.getWorkoutType().getDescription()); 
        workout.getWorkoutType().setPicture(filePath); 
        workoutsAdapter.notifyDataSetChanged();   
       } else { 
        System.err.println("Download failed"); 
       } 
      } 
     } 
    }; 

ответ

1

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

Вместо самого объекта передайте индекс объекта при создании намерения для отправки в службу. Когда служба публикует результаты, верните объект workout из адаптера по индексу, который вы передали при вызове службы.

+0

Это хорошая идея. Позвольте мне попробовать. – Alex

+0

Я почти там, но я не могу полностью преодолеть финишную черту. У меня есть позиция, возвращаемая радиовещательному приемнику вместе с именем файла. Но теперь я до сих пор не знаю, как заставить адаптер распознать этот файл и обновить изображение. Можете ли вы опубликовать код, который поможет мне? Благодаря! – Alex

+0

Я не уверен, что 'workout.getWorkoutType()' возвращает, и что происходит, когда вы вызываете 'setPicture()'. Но обычно адаптер устанавливает изображение, когда элемент перерисовывается. Вот хороший ответ, который показывает, как установить изображение в «ImageView» - http://stackoverflow.com/questions/8051069/how-to-show-image-using-imageview-in-android –

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