Subir varias imágenes al servidor en una cola

Caso de uso: Cargue imágenes en una cola en el fondo del servidor, las imágenes pueden ser urls web o archivos de imagen almacenados en la memoria del teléfono.

Lo que quiero Limitar el número de elementos en la cola a 3 y mostrar imágenes borrosas como marcadores de posición para las imágenes reales que se cargan en una recyclerview en una actividad con una barra de progreso en cada marcador de posición que indica cuánto se ha cargado. En la parte superior de cada marcador de posición hay tres botones para pausar, cancelar o reanudar la carga de la imagen.

Situación actual: En este momento, estaba utilizando Multipart en Retrofit 1.9.0 para cargar imágenes y esta llamada de servicio se estaba realizando dentro de la actividad.

No soy capaz de averiguar cómo cancelar, pausar o reanudar una solicitud multipart-POST utilizando Retrofit o cualquier otra biblioteca en general y cómo vincular un evento de IU con un hilo de servicio de api. Puedo actualizar la interfaz de usuario desde el servicio, pero ¿cómo puedo actualizar algo en el servicio de un evento en la interfaz de usuario (pausa / reanudar / cancelar)?

¿Cómo debo proceder con este caso de uso? ¿Necesito usar el servicio? ¿Puedo mostrar indicadores de progreso en otra actividad basada en las solicitudes que se ejecutan en el servicio? ¿Cuál debe ser la arquitectura para este proceso? No necesito el código para ello, pero si hay algunas referencias útiles relacionadas con esto, me gustaría leer y probarlo para finalmente derivar mi enfoque.

3 Solutions collect form web for “Subir varias imágenes al servidor en una cola”

Esto es lo que puede hacer: este es el código de ejemplo para cargar la imagen del dispositivo pasando la ruta de acceso de la imagen … de la misma manera que puede hacerlo para Image url, pasos: 1) Crear un hilo que se ejecutará para cada imagen. 2) después de que cada carga de imagen le dará la respuesta. 3) ahora para cada imagen puede actualizar su interfaz de usuario.

 //TODO: Multiple file upload public class FileUpload implements Runnable { Context context; String uploadApiUrl, uploadFilePath, fileType; int uploadId; LocalQueenDataBase localQueenDataBase; Activity activity; public FileUpload(Context context, ,String uploadApiUrl, String uploadFilePath, String fileType, int uploadId) { this.context = context; this.uploadApiUrl = uploadApiUrl; this.uploadFilePath = uploadFilePath; this.fileType = fileType; this.uploadId = uploadId; localQueenDataBase = new LocalQueenDataBase(context); Thread uploader = new Thread(this); uploader.start(); } @Override public void run() { try { executeMultipartPost(); } catch (Exception e) { e.printStackTrace(); } } public void executeMultipartPost() throws Exception { try { String originalPath = uploadFilePath; if (uploadFilePath == null) { uploadFilePath = originalPath; } HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("your api url"); httppost.addHeader("put your header if required") FileBody bin = new FileBody(new File(uploadFilePath)); StringBody fileTypeBody = new StringBody(fileType); StringBody uploadIdBody = new StringBody(uploadId + ""); MultipartEntity reqEntity = new MultipartEntity(); reqEntity.addPart("file", bin); reqEntity.addPart("fileType", fileTypeBody); reqEntity.addPart("uploadId", uploadIdBody); httppost.setEntity(reqEntity); HttpResponse response = httpclient.execute(httppost); HttpEntity resEntity = response.getEntity(); String retSrc = EntityUtils.toString(resEntity);//Render your response //TODO: update your UI for each uploaded image by creating the Handler Message msg = handler.obtainMessage(); handler.sendMessage(msg); } catch (Exception e) { e.printStackTrace(); } } } final Handler handler = new Handler() { @Override public void handleMessage(Message msg) { try { uploadGalleryRecyclerAdapter = new UploadGalleryRecyclerAdapter(getApplicationContext(), PostUpdateActivity.this, localQueenDataBase.getGallery()); postUpdateRV.setAdapter(uploadGalleryRecyclerAdapter); if (localQueenDataBase.getGallery().size() > 3) gallerylayoutManager.scrollToPosition(localQueenDataBase.getGallery().size() - 2); } catch (Exception e) { e.printStackTrace(); } super.handleMessage(msg); } }; 

Espero que esto te ayudará.

Recomiendo encarecidamente que utilice la cinta de Square mientras su carga de múltiples archivos / imágenes a la vez mirando la facilidad de uso, eficiencia, manejo de errores, sistema de colas. Si está utilizando un solo archivo a la vez, trate de usar cualquiera de las cargas de archivos de varias partes en cualquier cliente Http de Android

Esto es lo que Square's Tape:

Tape es una colección de clases relacionadas con colas para Android y Java de Square, Inc.

QueueFile es un FIFO rápido, transaccional, basado en archivos. La adición y eliminación de una instancia es una operación O (1) y es atómica. Las escrituras son sincrónicas; Los datos se escribirán en el disco antes de que vuelva una operación. El archivo subyacente está estructurado para sobrevivir a procesos e incluso fallos del sistema y si se produce una excepción de E / S durante un cambio de mutante, el cambio se interrumpe.

ObjectQueue representa un ordenamiento de objetos arbitrarios que pueden ser respaldados por el sistema de archivos (a través de QueueFile) o sólo en memoria.

TaskQueue es una cola de objetos especiales que contiene Tareas, objetos que tienen una noción de ejecución. Las instancias son gestionadas por un ejecutor externo que prepara y ejecuta tareas en cola.

 enter codepackage com.mohit.mom.multipleimage; import android.annotation.SuppressLint; import android.app.Activity; import android.app.ProgressDialog; import android.content.Context; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.os.Bundle; import android.os.StrictMode; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.GridView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.ByteArrayBody; import org.apache.http.entity.mime.content.StringBody; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.apache.http.util.EntityUtils; import java.io.ByteArrayOutputStream; import java.util.ArrayList; @SuppressLint("NewApi") public class MainActivity extends Activity { private Button upload, pick; private ProgressDialog dialog; MultipartEntity entity; GridView gv; int count = 0; public ArrayList<String> map = new ArrayList<String>(); Bundle b; TextView noImage; HttpEntity resEntity; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() .permitAll().build(); StrictMode.setThreadPolicy(policy); b = getIntent().getExtras(); noImage = (TextView) findViewById(R.id.noImage); upload = (Button) findViewById(R.id.btnUpload); pick = (Button) findViewById(R.id.btnPicture); gv = (GridView) findViewById(R.id.gridview); gv.setAdapter(new ImageAdapter(this)); if (b != null) { ArrayList<String> ImgData = b.getStringArrayList("IMAGE"); for (int i = 0; i < ImgData.size(); i++) { map.add(ImgData.get(i).toString()); } } else { noImage.setVisibility(View.VISIBLE); } upload.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { new ImageUploadTask().execute(count + "", "pk" + count + ".jpg"); } }); pick.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { Intent i3 = new Intent(MainActivity.this, UploadActivity.class); startActivity(i3); } }); } class ImageUploadTask extends AsyncTask<String, Void, String> { String sResponse = null; @Override protected void onPreExecute() { // TODO Auto-generated method stub super.onPreExecute(); dialog = ProgressDialog.show(MainActivity.this, "Uploading", "Please wait...", true); dialog.show(); } @Override protected String doInBackground(String... params) { try { String url = "yours url"; int i = Integer.parseInt(params[0]); Bitmap bitmap = decodeFile(map.get(i)); HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url); entity = new MultipartEntity(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); bitmap.compress(CompressFormat.JPEG, 50, bos); byte[] data = bos.toByteArray(); entity.addPart("user_id", new StringBody("199")); entity.addPart("club_id", new StringBody("10")); entity.addPart("club_image", new ByteArrayBody(data, "image/jpeg", params[1])); httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost); resEntity = response.getEntity(); sResponse = EntityUtils.toString(resEntity); //HttpResponse response = httpClient.execute(httpPost,localContext); //sResponse = EntityUtils.getContentCharSet(response.getEntity()); System.out.println("sResponse : " + sResponse); } catch (Exception e) { if (dialog.isShowing()) dialog.dismiss(); Log.e(e.getClass().getName(), e.getMessage(), e); } return sResponse; } @Override protected void onPostExecute(String sResponse) { try { if (dialog.isShowing()) dialog.dismiss(); if (sResponse != null) { Toast.makeText(getApplicationContext(), sResponse + " Photo uploaded successfully", Toast.LENGTH_SHORT).show(); count++; if (count < map.size()) { new ImageUploadTask().execute(count + "", "hm" + count + ".jpg"); } } } catch (Exception e) { Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); Log.e(e.getClass().getName(), e.getMessage(), e); } } } public Bitmap decodeFile(String filePath) { // Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true; BitmapFactory.decodeFile(filePath, o); // The new size we want to scale to final int REQUIRED_SIZE = 1024; // Find the correct scale value. It should be the power of 2. int width_tmp = o.outWidth, height_tmp = o.outHeight; int scale = 1; while (true) { if (width_tmp < REQUIRED_SIZE && height_tmp < REQUIRED_SIZE) break; width_tmp /= 2; height_tmp /= 2; scale *= 2; } BitmapFactory.Options o2 = new BitmapFactory.Options(); o2.inSampleSize = scale; Bitmap bitmap = BitmapFactory.decodeFile(filePath, o2); return bitmap; } private class ImageAdapter extends BaseAdapter { private Context mContext; public ImageAdapter(Context c) { mContext = c; } public int getCount() { return map.size(); } public Object getItem(int position) { return null; } // create a new ImageView for each item referenced by the Adapter public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { // if it's not recycled, initialize some // attributes imageView = new ImageView(mContext); imageView.setLayoutParams(new GridView.LayoutParams(85, 85, Gravity.CENTER)); imageView.setScaleType(ImageView.ScaleType.FIT_XY); imageView.setPadding(1, 1, 1, 1); } else { imageView = (ImageView) convertView; } //Bitmap bm=BitmapFactory.decodeFile(map.get(position)); final BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = 8; Bitmap bmp = BitmapFactory.decodeFile(map.get(position),options); imageView.setImageBitmap(bmp); return imageView; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } } @Override public void onBackPressed() { // TODO Auto-generated method stub super.onBackPressed(); MainActivity.this.finish(); } } 
  • Creación de una cola de carga
  • EPIPE (Broken pipe) durante la carga?
  • No se puede tomar el progreso en la carga de archivos POST HTTP (Android)
  • Subir vídeo en twitter
  • Picasso para cargar matriz de bytes
  • MultipartEntity y Json
  • Cargar un archivo a través de un formulario HTTP, a través de MultipartEntityBuilder, con una barra de progreso
  • Android Studio nunca termina de cargar la aplicación en el Nexus 10
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.