onPostExecute () иногда не вызывается в AsyncTask - PullRequest
0 голосов
/ 21 сентября 2019

Я пытаюсь загрузить строку через php на свой сервер, поэтому я использую httpost внутри асинхронной задачи, но у меня есть проблема с ним, он работает вместе с индикатором выполнения, чтобы показать свой прогресс в уведомлении, когда я заканчиваю выполнение httpostвнутри Idoinbackground он продолжает работу, вызывая onpostexecute (), который обновляет уведомление как «завершено», но это вызывается только несколько раз, иногда нет, например, когда он запускается в первый раз, когда он не работает, метод невызывается, даже если httpost завершил работу, но когда я запускаю его в режиме отладки во второй раз, если уведомление обновляется, по отношению к PHP оно ничего не возвращает, и в обоих случаях строка успешно загружена, правда в том, чтоЯ не понимаю, почему onpostexecute иногда не запускается, если httpost выполняет функцию загрузки строки, выполнив php

MainActivity.java

public class MainActivity extends AppCompatActivity {
    Button uploadBtn;
    String newDataArray;
    HttpEntity resEntity;
    //private ProgressBar progressBar;
    String imagenes[]=new String[10];
    NotificationCompat.Builder notification;
    Gson gson;
    NotificationManagerCompat notificationManager;
    NotificationCompat.Builder builder;
    NotificationManagerCompat notificationManagerCompat;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        uploadBtn=(Button) findViewById(R.id.btn_upload);
        //progressBar = (ProgressBar) findViewById(R.id.progressBar);
        //progressBar.setMax(100);
        //progressBar.setProgress(0);
        gson=new Gson();
        imagenes[0]=convertirImgString(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.i1));
        imagenes[1]=convertirImgString(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.i2));
        imagenes[2]=convertirImgString(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.i3));
        imagenes[3]=convertirImgString(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.i4));
        imagenes[4]=convertirImgString(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.i5));
        imagenes[5]=convertirImgString(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.i6));
        imagenes[6]=convertirImgString(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.i7));
        imagenes[7]=convertirImgString(BitmapFactory.decodeResource(MainActivity.this.getResources(), R.drawable.i8));
        newDataArray=gson.toJson(imagenes);
        uploadBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //progressBar.setVisibility(View.GONE);
                crearcanaldenotificaciones();
                builder = new NotificationCompat.Builder(MainActivity.this,"Personal_notification");
                builder.setSmallIcon(R.drawable.logoapp);
                builder.setContentTitle("Publicacion");
                builder.setContentText("Subiendo");
                builder.setPriority(NotificationCompat.PRIORITY_LOW);
                builder.setOngoing(true);
                builder.setProgress(100, 0, true);
                notificationManagerCompat = NotificationManagerCompat.from(MainActivity.this);
                notificationManagerCompat.notify(1,builder.build());
                new UploadFileToServer().execute();
            }
        });
        int nnum=1;
    }
    public void crearcanaldenotificaciones(){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
            CharSequence name = "publicaciones";
            String description = "compartir";
            int importance = NotificationManager.IMPORTANCE_LOW;
            NotificationChannel notificationChannel = new NotificationChannel("Personal_notification",name,importance);
            notificationChannel.setDescription(description);
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(notificationChannel);
        }
    }
    private String convertirImgString(Bitmap bitmap) {
        ByteArrayOutputStream array=new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG,100,array);
        byte[] imagenByte=array.toByteArray();
        String imagenString= Base64.encodeToString(imagenByte,Base64.DEFAULT);
        return imagenString;
    }
    class UploadFileToServer extends AsyncTask<Void, Integer, String> {
        float totalSize;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
            builder.setProgress(100,progress[0],false);
            notificationManagerCompat.notify(1,builder.build());
            //progressBar.setProgress(progress[0]);
        }

        @Override
        protected String doInBackground(Void... params) {
            String responseString = null;

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost("http://localhost/publicaruser.php");

            try {
                AndroidMultiPartEntity entity = new AndroidMultiPartEntity(new AndroidMultiPartEntity.ProgressListener() {
                    @Override
                    public void transferred(long num) {
                        publishProgress((int) ((num / (float) totalSize) * 100));
                    }
                });
                entity.addPart("user", new StringBody(newDataArray));
                totalSize = entity.getContentLength();
                httppost.setEntity(entity);
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity r_entity = response.getEntity();
                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == 200) {
                    responseString = EntityUtils.toString(r_entity);
                } else {
                    responseString = "Error occurred! Http Status Code: " + statusCode;
                }

            } catch (ClientProtocolException e) {
                responseString = e.toString();
            } catch (IOException e) {
                responseString = e.toString();
            }
            return responseString;
        }

        @Override
        protected void onCancelled(String s) {
            super.onCancelled(s);
            Toast.makeText(MainActivity.this, "Cancelado", Toast.LENGTH_SHORT).show();
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            builder.setContentText("Finalizado");
            builder.setProgress(0,0,false);
            builder.setOngoing(false);
            notificationManagerCompat.notify(1,builder.build());
        }

    }
}

AndroidMultipartEntity.java

public class AndroidMultiPartEntity extends MultipartEntity

{

    private final ProgressListener listener;

    public AndroidMultiPartEntity(final ProgressListener listener) {
        super();
        this.listener = listener;
    }

    public AndroidMultiPartEntity(final HttpMultipartMode mode,
                                  final ProgressListener listener) {
        super(mode);
        this.listener = listener;
    }

    public AndroidMultiPartEntity(HttpMultipartMode mode, final String boundary,
                                  final Charset charset, final ProgressListener listener) {
        super(mode, boundary, charset);
        this.listener = listener;
    }

    @Override
    public void writeTo(final OutputStream outstream) throws IOException {
        super.writeTo(new CountingOutputStream(outstream, this.listener));
    }

    public static interface ProgressListener {
        void transferred(long num);
    }

    public static class CountingOutputStream extends FilterOutputStream {

        private final ProgressListener listener;
        private long transferred;

        public CountingOutputStream(final OutputStream out, final ProgressListener listener) {
            super(out);
            this.listener = listener;
            this.transferred = 0;
        }

        public void write(byte[] b, int off, int len) throws IOException {
            out.write(b, off, len);
            this.transferred += len;
            this.listener.transferred(this.transferred);
        }

        public void write(int b) throws IOException {
            out.write(b);
            this.transferred++;
            this.listener.transferred(this.transferred);
        }
    }
}

publicaruser.php

<?php
            $receiver_data= $_REQUEST['user'];
            $new_array=json_decode($receiver_data,true);
            $cantidadefotos = 8;
            $foto = 'si';
            $contador=1;
            if($foto == 'si'){
               for($i=0; $i<$cantidadefotos; $i++){
                   $idfoto = $new_array[$i];
                   $path = "prueba/$contador.jpg";
                   $eso = file_put_contents($path,base64_decode($idfoto));
                   $contador++;
               }
            }
?>

Интерфейс:

enter image description here

Когда это иногда заканчивается:

enter image description here

Когда это иногда не заканчивается, оно остается таким, и вы правильно завершили выполнение httpst php:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...