Как продолжить процесс загрузки, который начинается на переднем плане даже после того, как приложение было убито android? - PullRequest
0 голосов
/ 23 января 2020

Я работаю над проектом, в котором есть требование загрузки файлов на сервер. Для загрузки больших файлов загрузка займет много времени. Чтобы избежать этой ситуации, я думал о загрузке файлов из фона. Для загрузки файлов из фона я использовал службу внутри этой службы. Я использую задачу Asyn c для загрузки файлов, проблема заключается в том, что загрузка началась, и если удаление приложения означает, что остановка службы также прекращается. Как решить эту проблему. Пожалуйста, найдите мой фрагмент кода ниже того, что я делал до сих пор

public class BackgroundService extends Service {

ProgressRequestBody.UploadCallbacks callbacks = new ProgressRequestBody.UploadCallbacks() {
    @Override
    public void onProgressUpdate(int percentage) {
        Log.i("percentage", "" + percentage);
    }

    @Override
    public void onError() {

    }

    @Override
    public void onFinish(int finished) {

    }
};


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

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    String filePath = intent.getStringExtra("filePath");
    final int studentId = intent.getIntExtra("studentId", 0);
    int documentType = intent.getIntExtra("type", 0);
    uplodeBackground uplodeBackground = new uplodeBackground();
    uplodeBackground.execute(filePath, String.valueOf(documentType), String.valueOf(studentId));
    return START_STICKY;
}

class uplodeBackground extends AsyncTask<String, Void, Void> {
    @Override
    protected Void doInBackground(String... strings) {


        ApiInterface apiInterface = ApiClient.getClient().create(ApiInterface.class);
        File file = new File(strings[0]);
        //RequestBody progressRequestBody = RequestBody.create(MediaType.parse("multipart/*"), file);
        ProgressRequestBody progressRequestBody = new ProgressRequestBody(file, callbacks);
        MultipartBody.Part[] part = new MultipartBody.Part[2];
        part[0] = MultipartBody.Part.createFormData("file", file.getName(), progressRequestBody);
        part[1] = MultipartBody.Part.createFormData("documentTypeId", strings[1]);
        RequestBody mStudendId = RequestBody.create(MediaType.parse("text/plain"), /*String.valueOf(studentId)*/strings[2]);
        Call<JsonObject> call = apiInterface.uploadFile(part, mStudendId);
        call.enqueue(new Callback<JsonObject>() {
            @Override
            public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
                if (response.isSuccessful()) {
                    if (response.body().get("status").getAsInt() == 200) {
                        Log.i("test", "Uploaded successfully..........");

                    }
                }
            }


            @Override
            public void onFailure(Call<JsonObject> call, Throwable t) {
                Log.i("test", "Failed successfully..........");
            }
        });
        return null;
    }
}

}

вот так я запускаю службу

 Intent intent = new Intent(AddVideoFragment.this, BackgroundService.class);
                intent.putExtra("filePath", SelectedFile.getPath());
                intent.putExtra("studentId", NewRegistartionController.initializeNewRegistrationController().basicDetailsModel.getStudentId());
                intent.putExtra("type", doumentTypeId);
                intent.putExtra("contentId", objects[1].toString());
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                    startForegroundService(intent);
                } else {
                    startService(intent);
                }

1 Ответ

0 голосов
/ 23 января 2020

Вы вызываете свой класс AsyncTask в службе forground. Только служба forground не убивает, когда приложение в фоновом режиме.

...