在最后一个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 ...
答案 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.VIDEOS
和DownloadService.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);
}