0

这有点令人费解,所以请多多包涵。我有一个具有 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);
  }

然后回到ListActivityBroadcastReceiver。这会产生一个空指针错误,因为对象 '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");
                }
            }
        }
    };
4

1 回答 1

1

我假设您的workout对象在适配器中。在这种情况下,您可以使用workout对象的索引作为唯一标识符。

当您创建发送到服务的意图时,而不是对象本身,而是传递对象的索引。当服务发布结果时,workout通过调用服务时传递的索引从适配器中获取正确的对象。

于 2013-08-20T03:04:38.977 回答