putExtra覆盖其他putExtra

时间:2011-10-12 10:44:25

标签: android

在最后一个putExtra下面的for循环中,覆盖了第一个putExtra,即使它们采用不同的参数和不同的变量。

首先:putExtra(String,String) 第二:putExtra(String,int)

注意:videos [i]是一个String数组

 Intent intent = new Intent(this,DownloadService.class);
        for(int i=0;i<videos.length;i++){
             intent.putExtra("VIDEOS",videos[i]);
         intent.putExtra("FILENR",(i + 1));          
             startService(intent);

        }

在扩展IntentService的DownloadService中,VIDEOS的值为null !! 那是为什么?

编辑: 这是我的DownloadService类中代码的一部分:

Intent broadcastIntent = new Intent();
    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, null, 0);

notification = new Notification(R.drawable.icon, "Skitips", System.currentTimeMillis());
contentView = new RemoteViews(getPackageName(), R.layout.progress_layout);
notification.flags = Notification.FLAG_AUTO_CANCEL;
notification.contentView = contentView;
notification.contentIntent = contentIntent;
contentView.setProgressBar(R.id.status_progress, 100, 0, false);        
contentView.setTextViewText(R.id.status_text,"Downloading...");

String full_url = "";

    full_url = URL + intent.getStringExtra("VIDEOS");

String fileName = "";

    fileName = intent.getStringExtra("VIDEOS");

String fileNr = "";

    fileNr = intent.getStringExtra("FILENR");


    int count;






   Log.e("Whattttttt","is the value of VIDEOOOOSSSS: " + full_url);
    Log.e("Whatttt","is the value of fileNrrrrrrrrrrrr:" + fileNr);
    try {
    URL url = new URL(full_url);
    URLConnection conexion = url.openConnection();
    conexion.connect();
    File file = new File(root.getPath(), fileName);

    int lenghtOfFile = conexion.getContentLength();
    Log.d("ANDRO_ASYNC", "Lenght of file: " + lenghtOfFile);

    InputStream input = new BufferedInputStream(url.openStream());
    OutputStream output = new FileOutputStream(file);

    byte data[] = new byte[1024];

    long total = 0;

contentView.setTextViewText(R.id.status_text,“正在下载(”+ fileNr +“/ 77)”);

在粗体文本中有fileNr我需要从其他活动获取fileNr,但在这种情况下它给我null ...

4 个答案:

答案 0 :(得分:3)

这是因为putExtra()将数据添加到hashmap。使用hashmap如果使用相同的键,则最新的值会覆盖先前的值。

答案 1 :(得分:2)

在你的问题中

对于不同的值,

键始终保持相同,这就是为什么,

尝试使用

         intent.putExtra(DownloadService.VIDEOS+i,videos[i]);
         intent.putExtra(DownloadService.fileNr+i, i++);     

获得结果,

        DownloadService.VIDEOS0,DownloadService.fileNr0,
        DownloadService.VIDEOS1,DownloadService.fileNr1,

编辑:试试这段代码..

 Intent intent = new Intent(this,DownloadService.class);
        putStringArrayListExtra("Videos_key", videos);
        startService(intent);

还有一件事,如果你要传递array of integer和一些Array of video URI,那么请尝试使用

    putStringArrayListExtra(String name, ArrayList<String> value)
    putIntegerArrayListExtra(String name, ArrayList<Integer> value)

并避免循环..

感谢。

答案 2 :(得分:0)

当然,它们会相互覆盖,因为您使用相同的密钥编写它们(DownloadService.VIDEOSDownloadService.fileNr对于所有值都是相同的。)

您可以添加额外的密钥,例如

intent.putExtra("number", videos.length);

在循环之外,然后将值写为

intent.putExtra(DownloadService.VIDEOS + i,videos[i]);
intent.putExtra(DownloadService.fileNr + i, i++);

要阅读它们首先阅读number并使用循环来读取您的值

答案 3 :(得分:0)

你没有在你的循环中给出不同的密钥名称。因为你循环将运行不止一次然后下次你只在DownloadService.VIDEOS中将值video [i]放在以前的密钥中所以尝试给出一个唯一的名称你的密钥DownloadService.VIDEOS第二个值等等。当循环运行多次时,为DownloadService.fileNr提供唯一的名称

正确的答案是将i添加为您的密钥中的字符串,然后通过提供密钥名称

来获取它

输入字符串值

  

intent.putExtra(DownloadService.VIDEOS + i,videos [i]);

     

intent.putExtra(DownloadService.fileNr + i,i ++);

获取字符串值

 for(int i=0;i<videos.length;i++)
    {
    intent.getExtra(DownloadService.VIDEOS + i);
    }