代码之家  ›  专栏  ›  技术社区  ›  Feroz Siddiqui

Android-如何在后台进程中下载大量图片(大量http url)

  •  0
  • Feroz Siddiqui  · 技术社区  · 6 年前

    到目前为止,我已经运行了一个前台服务,其中我使用ExecutorService来运行线程。我的服务代码在下面

    public class SaveImageService extends Service {
    
        private Context context;
        public static final String NOTIFICATION_CHANNEL_ID = "10001";
        public SaveImageService() {
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
                startMyOwnForeground();
            else
                startForeground(1, new Notification());
        }
    
    
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            context = this;
            super.onStartCommand(intent, flags, startId);
            List<Callable<String>> saveDataThreads = new ArrayList<>();
            SaveTaskImage saveTaskImage = new SaveTaskImage(this);
            saveDataThreads.add(saveTaskImage);
            ExecutorService executor = Executors.newFixedThreadPool(saveDataThreads.size());
            try {
                List<Future<String>> aaa = executor.invokeAll(saveDataThreads);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            executor.shutdown();
            if (executor.isShutdown()) {
                stopForeground(true);
                stopSelf();
            }
            return START_STICKY;
        }
    
        @Override
        public IBinder onBind(Intent intent) {
            // TODO: Return the communication channel to the service.
            throw new UnsupportedOperationException("Not yet implemented");
        }
    
        @RequiresApi(api = Build.VERSION_CODES.O)
        private void startMyOwnForeground() {
            String NOTIFICATION_CHANNEL_ID = "com.example.simpleapp";
            String channelName = "My Background Service";
            NotificationChannel chan = new NotificationChannel(NOTIFICATION_CHANNEL_ID, channelName, NotificationManager.IMPORTANCE_NONE);
            chan.setLightColor(Color.BLUE);
            chan.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
            NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            assert manager != null;
            manager.createNotificationChannel(chan);
    
            NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID);
            Notification notification = notificationBuilder.setOngoing(true)
                    .setSmallIcon(R.mipmap.talentify_logo_red)
                    .setContentTitle("App is running in background")
                    .setPriority(NotificationManager.IMPORTANCE_MIN)
                    .setCategory(Notification.CATEGORY_SERVICE)
                    .build();
            startForeground(2, notification);
        }
    }
    

    在SaveTask线程中,我触发了一个同步任务,如下所示

    new SaveImageAsync ("file_path").executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,url);
    

    public class SaveImageAsync extends AsyncTask<String, Void, String> {
        private MediaSaver mediaSaver;
    
        public SaveImageAsync(MediaSaver mediaSaver){
            this.mediaSaver = mediaSaver;
        }
        @Override
        protected String doInBackground(String... params) {
            Bitmap bmp = null;
            try{
                System.out.println("Save image url --> "+params[0].replaceAll(" ", "%20"));
                URL url = new URL(params[0].replaceAll(" ", "%20"));
                InputStream fileInputStream = url.openStream();
                if(fileInputStream != null) {
                    mediaSaver.save(fileInputStream);
                    System.out.println("Saving  image --> ");
                }else{
                    System.out.println("Not Saving  image --> ");
    
                }
            }catch (Exception e){
                e.printStackTrace();
            }
            return "";
        }
    
        @Override
        protected void onPostExecute(String string) {
        }
    }
    

    但在这种方法中,我只能在背景中保存50-60个图像。它一直走到尽头。我该怎么办?有什么建议吗

    1 回复  |  直到 6 年前
        1
  •  1
  •   Farman Ali Khan    6 年前

    在库下面使用-

    implementation 'com.amitshekhar.android:android-networking:1.0.2'
    

    图书馆的实施-

    for (int j = 0; j < imageArrayList.size(); j++) {
            downloadImage(imageArrayList.getImagePath(j), imageArrayList.get(j),getImageName);
        }
    
    
     private void downloadImage(String imageURL, String imagename) {
    
        AndroidNetworking.download(imageURL, getCacheDir().getPath() + "/" + Constant.FOLDER_NAME + "/", imagename)
                .setPriority(Priority.HIGH)
                .build()
                .setDownloadProgressListener(new DownloadProgressListener() {
                    @Override
                    public void onProgress(long bytesDownloaded, long totalBytes) {
                        // do anything with progress
                    }
                })
                .startDownload(new DownloadListener() {
                    @Override
                    public void onDownloadComplete() {
    
                        // do anything after completion
    
    
                    }
    
                    @Override
                    public void onError(ANError error) {
                        // handle error
    
                    }
                });
    
    }
    

    您还可以使用android DownloadManager API。 Android: How to use download manager class?