2012-12-20 33 views
1

我尝试启动服务以从服务器下载文件。当我使用BroadcastReceiver管理DownloadManager的返回时,问题就开始了,如果我在我的MainActivity中复制粘贴,它会起作用,但是在Service中会引发错误。我的目标是下载一个文件(视频),当它完成下载下一个,但它只下载第一个,然后抛出错误。正在服务的BroadcastReceiver

我的类:

public class VideosDownloader extends IntentService { 

    public VideosDownloader() { 
     super("VideosDownloader"); 
    } 

    private boolean download = true; 
    private final String SERVER_URL = 
      "http://127.0.0.1/42de2533d3b2776e456d62cd0fc3a101/"; 
    private SharedPreferences preferenceManager; 
    final String strPref_Download_ID = "VIDEOS_DOWNLOAD_ID"; 
    private long enqueue; 
    private DownloadManager manager; 
    private int count = 0; 
    private int count_max = 6; 

    @Override 
    protected void onHandleIntent(Intent intent) { 
     Bundle b = intent.getExtras(); 
     preferenceManager = PreferenceManager.getDefaultSharedPreferences(this); 
     manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE); 
     // THROW THE FIRST TIME: 
     DownloadManager.Request request=new DownloadManager.Request(
       Uri.parse(SERVER_URL + "video" + count + ".mp4")); 
     request.setDescription(""); 
     request.setTitle("Downloading"); 
     request.setDestinationInExternalPublicDir(
       Environment.DIRECTORY_DOWNLOADS, "video" + count + ".mp4"); 
     request.setShowRunningNotification(true); 
     enqueue = manager.enqueue(request); 
     Editor PrefEdit = preferenceManager.edit(); 
     PrefEdit.putLong(strPref_Download_ID, enqueue); 
     PrefEdit.commit(); 
     count++; 
     BroadcastReceiver receiver = new BroadcastReceiver() { 

      private int progress = 0; 

      @Override 
      public void onReceive(Context context, Intent intent) { 
       if (count < count_max) { 
        DownloadManager.Request request = new DownloadManager.Request(
          Uri.parse(SERVER_URL + "video" + count + ".mp4")); 
        request.setDescription(""); 
        request.setTitle("Downloading..."); 
        request.setDestinationInExternalPublicDir(
          Environment.DIRECTORY_DOWNLOADS, "video" + count 
            + ".mp4"); 
        request.setShowRunningNotification(true); 
        enqueue = manager.enqueue(request); 
        Editor PrefEdit = preferenceManager.edit(); 
        PrefEdit.putLong(strPref_Download_ID, enqueue); 
        PrefEdit.commit(); 
        Log.d("ENQUEUE", "ENQUEUE: " + enqueue); 
        count++; 
       } 
      } 
     }; 
     registerReceiver(receiver, new IntentFilter(
       DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 
    } 
} 

logcat的,我不明白的错误:

12-20 10:17:06.859: E/ActivityThread(12324): Service com.example.downloadtest.VideosDownloader has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
    12-20 10:17:06.859: E/ActivityThread(12324): android.app.IntentReceiverLeaked: Service com.example.downloadtest.VideosDownloader has leaked IntentReceiver [email protected] that was originally registered here. Are you missing a call to unregisterReceiver()? 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:756) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:551) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:836) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.app.ContextImpl.registerReceiver(ContextImpl.java:823) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.app.ContextImpl.registerReceiver(ContextImpl.java:817) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:318) 
    12-20 10:17:06.859: E/ActivityThread(12324): at com.example.downloadtest.VideosDownloader.onHandleIntent(VideosDownloader.java:132) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:59) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.os.Handler.dispatchMessage(Handler.java:99) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.os.Looper.loop(Looper.java:138) 
    12-20 10:17:06.859: E/ActivityThread(12324): at android.os.HandlerThread.run(HandlerThread.java:60) 

感谢您的答复。

+1

因此,“您是否缺少对unregisterReceiver()的调用?” – Egor

+0

看起来你错过了取消注册。下载文件后......并且您可以尝试一个AsyncTask for this ...在Asynctask函数的doinbackground中,您应该实现代码下载视频文件。 – itsrajesh4uguys

+0

它不工作我会尝试解决布伦德尔谢谢你的答复。 –

回答

0

an IntentService在请求之间中止。

当你注册你从来没有注销其服务的接收器,让你“漏呢”

将您的接收器插入Activity,在onResume注册和注销。

然后每次你的寄存器接收广播时发送的意图,你Service

http://developer.android.com/reference/android/content/BroadcastReceiver.html

Note: If registering a receiver in your Activity.onResume() implementation, you should unregister it in Activity.onPause(). (You won't receive intents when paused, and this will cut down on unnecessary system overhead). Do not unregister in Activity.onSaveInstanceState(), because this won't be called if the user moves back in the history stack.

+0

好吧,我会尝试它的信息感谢。 –

0

任何时候收到指定的Intent时都会调用onHandleIntent()。因此,您无数次注册您的BroadcastReceiver。

因此,当您完成操作时,您必须调用unregisterReceiver,或者在创建服务时注册BroadcastReceive,而不是在触发onHandleIntent时注册。

+0

它不工作我会尝试Blundell谢谢答复的解决方案。 –

0


我的想法是不要放或者注册广播接收器内的service.It是一个坏主意
您可以从广播接收器启动服务。
如果您在服务中放入/注册广播接收器,那么您需要取消注册。它更复杂