Android服务,跟踪对象

时间:2013-08-20 02:55:59

标签: android-intent service broadcastreceiver pass-by-reference

这有点令人费解,所以请耐心等待。我有一个具有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'为null(如果通过引用传递它不会为null):

    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 个答案:

答案 0 :(得分:1)

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

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