Это своего рода запутанное, поэтому, пожалуйста, несите меня. У меня есть объект, который имеет переменную экземпляра 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");
}
}
}
};
Это хорошая идея. Позвольте мне попробовать. – Alex
Я почти там, но я не могу полностью преодолеть финишную черту. У меня есть позиция, возвращаемая радиовещательному приемнику вместе с именем файла. Но теперь я до сих пор не знаю, как заставить адаптер распознать этот файл и обновить изображение. Можете ли вы опубликовать код, который поможет мне? Благодаря! – Alex
Я не уверен, что 'workout.getWorkoutType()' возвращает, и что происходит, когда вы вызываете 'setPicture()'. Но обычно адаптер устанавливает изображение, когда элемент перерисовывается. Вот хороший ответ, который показывает, как установить изображение в «ImageView» - http://stackoverflow.com/questions/8051069/how-to-show-image-using-imageview-in-android –