Ashish R Kudale Ответов: 0

Службы замедляют работу моего приложения.


Привет, я загружаю несколько файлов в фоновом режиме и показываю индикатор выполнения в уведомлении. Но когда я запускаю свой сервис мое приложение начинает отставать в результате чего Диалог "Не Отвечает".

Я поискал в интернете и обнаружил, что служба должна работать в другом потоке. Я сделал, как они сказали, но все равно это приложение висит.

Я создал сервис под названием загрузить обновления это функциональность, скачивание которых пишется Н чет

Что я уже пробовал:

public class DownloadService extends Service {

    private final int notificationId = 1;
    private RemoteViews remoteViewsSmall, remoteViewsBig;
    private NotificationManagerCompat notificationManager;
    private NotificationCompat.Builder mBuilder;

    public DownloadService() {
    }

    public class BackgroundThread implements Runnable {
        int serviceId;

        public BackgroundThread(int serviceId) {
            this.serviceId = serviceId;
        }

        @Override
        public void run() {

            remoteViewsSmall = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification_small);
            remoteViewsBig = new RemoteViews(getApplicationContext().getPackageName(), R.layout.notification);

            notificationManager = NotificationManagerCompat.from(DownloadService.this);
            mBuilder = new NotificationCompat.Builder(DownloadService.this, "1");
            mBuilder.setContentTitle("Picture Download")
                    .setContentText("Download in progress")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setOngoing(true)
                    .setCustomContentView(remoteViewsSmall)
                    .setCustomBigContentView(remoteViewsBig)
                    .setPriority(NotificationCompat.PRIORITY_HIGH);

            if (android.os.Build.VERSION.SDK_INT > 9) {
                StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
                StrictMode.setThreadPolicy(policy);
            }

            int PROGRESS_MAX = 100;
            try {

                ArrayList<Download> list = new ArrayList<>();
                list.add(new Download("https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_5mb.mp4","file1.mp4"));
                list.add(new Download("https://www.sample-videos.com/video/mp4/720/big_buck_bunny_720p_5mb.mp4","file.mp4"));

                for (int i = 0; i < list.size(); i++) {
                    Download download = list.get(i);
                    URL url = new URL(download.url);
                    HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
                    urlConnection.setRequestMethod("GET");
                    urlConnection.setDoOutput(true);
                    urlConnection.connect();
                    int fileSize = urlConnection.getContentLength();

                    File sdcard = Environment.getExternalStorageDirectory();
                    File file = new File(sdcard, download.fileName);
                    if (!file.exists()) {
                        file.createNewFile();
                    }

                    FileOutputStream fileOutput = new FileOutputStream(file);
                    InputStream inputStream = urlConnection.getInputStream();

                    byte[] buffer = new byte[1024];
                    int bufferLength = 0;
                    int count = 0;
                    while ((bufferLength = inputStream.read(buffer)) > 0) {

                        fileOutput.write(buffer, 0, bufferLength);
                        count += bufferLength;

                        int progress = (int) (count * 100 / (float) fileSize) + 1;

                        updateProgress(list.size(), i+1, progress, download.fileName);
                        //mBuilder.setProgress(PROGRESS_MAX, (int) (count * 100 / (float) fileSize) + 1, false);
                        notificationManager.notify(notificationId, mBuilder.build());
                    }
                    fileOutput.close();

                    //mBuilder.setContentText("Download complete").setProgress(PROGRESS_MAX, PROGRESS_MAX, false);
                    //mBuilder.setContentTitle("Download complete");
                    updateProgress(list.size(), list.size(), 100, "Download complete");
                    mBuilder.setOngoing(false);
                    notificationManager.notify(notificationId, mBuilder.build());

                }

                Log.e("DownloadingService", "File downloaded successfully");

            } catch (MalformedURLException e) {
                Log.e("DownloadingService", "Failed: Exception:", e);
            } catch (IOException e) {
                Log.e("DownloadingService", "Failed: Exception:", e);
            }
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this, "Service started", Toast.LENGTH_SHORT).show();
        Thread thread = new Thread(new BackgroundThread(startId));
        thread.start();
        return START_STICKY;
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
    }

    private void updateProgress(int totalFiles, int currentFileCount, int currentProgress, String fileName) {

        remoteViewsSmall.setTextViewText(R.id.tvOverAll, currentProgress+"%");
        remoteViewsSmall.setProgressBar(R.id.overallProgress, 100, currentProgress, false);

        remoteViewsBig.setTextViewText(R.id.tvOverAll, currentFileCount+"/"+totalFiles);
        remoteViewsBig.setTextViewText(R.id.tvFileName, "Downloading "+fileName);
        remoteViewsBig.setProgressBar(R.id.overallProgress, totalFiles, currentFileCount, false);
        remoteViewsBig.setProgressBar(R.id.currentProgress, 100, currentProgress, false);

        //notificationManager.notify(notificationId, mBuilder.build());
    }
}

David Crow

Что ваше приложение не использует этот и взаимодействие с пользовательским интерфейсом было бы для меня двумя основными проблемами.

0 Ответов