0

Я ищу способ хорошей работы. Загрузите службу для обработки нескольких запросов на загрузку. Цель должна состоять в том, чтобы отображать уведомление с фактическим прогрессом всех загрузок вместе.Служба загрузки изображений для Android

С тех пор я получил его работу с вызовом AsyncTask для каждого запроса, но таким образом я не получаю одно уведомление для всех из них, только по одному для каждого.

Я прочитал об использовании Сервисов, но ничего не нашел о получении Сервиса (также может быть IntentService), обрабатывая несколько запросов. Чтобы снова указать на это: пользователь должен иметь возможность запускать загрузку в любое время и должен иметь возможность «добавлять» новую загрузку в любое время, но загрузка должна выполняться в фоновом режиме, поскольку то, что будет загружено являются изображениями переменных размеров, означает, что они могут стать довольно большими. Также важным является возможность добавления пользовательских объектов String, как отмечено в коде как «дополнительные ...», ...

Вот фактический код моего AsyncTask:

import java.io.File; 
import java.io.IOException; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.auth.AuthScope; 
import org.apache.http.auth.UsernamePasswordCredentials; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.mime.content.FileBody; 
import org.apache.http.entity.mime.content.StringBody; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.util.EntityUtils; 

import android.app.NotificationManager; 
import android.content.Context; 
import android.os.AsyncTask; 
import android.support.v4.app.NotificationCompat; 
import android.support.v4.app.NotificationCompat.Builder; 
import android.util.Log; 

public class ImageUploader extends AsyncTask<String, Integer, String> { 

    private Context context; 
    private String name = null; 
    private String filePath = null; 

    private NotificationManager mNotifyManager; 
    private Builder mBuilder; 

    public void setContext(Context context, String name){ 
     this.context = context; 
     this.name = name; 
    } 

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

     mNotifyManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
     mBuilder = new NotificationCompat.Builder(context); 
     mBuilder.setContentTitle(name) 
       .setContentText("Image is being uploaded") 
       .setSmallIcon(android.R.drawable.ic_menu_upload); 
     mBuilder.setProgress(100, 0, false); 
     mNotifyManager.notify(1, mBuilder.build()); 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     mBuilder.setProgress(100, progress[0], false); 
     mNotifyManager.notify(1, mBuilder.build()); 
     super.onProgressUpdate(progress); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     filePath = params[0];   
     return uploadFile(); 
    } 

    private String uploadFile() { 
     String responseString = null; 

     DefaultHttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost(SERVER_PHP_URL); 

     httpclient.getCredentialsProvider().setCredentials(new AuthScope(SERVER_HOST, AuthScope.ANY_PORT), new UsernamePasswordCredentials(SERVER_USER, SERVER_PASSWORD)); 

     try { 
      AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
        new ProgressListener() { 

         @Override 
         public void transferred(long num) { 
          publishProgress((int) ((num/(float) totalSize) * 100)); 
         } 
        }); 

      File sourceFile = new File(filePath); 

      entity.addPart("image", new FileBody(sourceFile)); 

      entity.addPart("additional...", new StringBody("anything")); 
      entity.addPart("additional2...", new StringBody("anything")); 

      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 onPostExecute(String result) { 
     mBuilder.setContentText("Image uploaded successfully"); 
     mBuilder.setProgress(0, 0, false); 
     mNotifyManager.notify(1, mBuilder.build()); 
     super.onPostExecute(result); 
    } 
} 

Настроенный MultipartEntity как следует:

import java.io.FilterOutputStream; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.nio.charset.Charset; 

import org.apache.http.entity.mime.HttpMultipartMode; 
import org.apache.http.entity.mime.MultipartEntity; 

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); 
     } 
    } 
} 

Было бы здорово, если бы кто-то мог привести меня на правильный путь. Большое спасибо!

ответ

0

Вы можете попробовать использовать некоторые библиотеки для организации нескольких задач, таких как Горо ( https://github.com/stanfy/goro)

Также вы можете использовать новую тему в собственной отдельной службы и некоторых детей класса BlockingQueue или класса Handler внутри Thread. По-моему, это более сложная работа.

Sory для моего плохого английского