这有点令人费解,所以请多多包涵。我有一个具有 ImageView 实例变量的对象。我需要附加到对象的图像存储在服务器上,并且会因实例而异。因此,我需要动态获取它。
每个对象都通过类的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
。这会产生一个空指针错误,因为对象 'workout' 为空(如果它是通过引用传递的,则它不会为空):
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");
}
}
}
};