Я пытаюсь загрузить строку через 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++;
}
}
?>
Интерфейс:

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

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