简体   繁体   English

Android使用服务将文件上传到带有进度条的服务器

[英]Android upload file to server with progressbar using service

I have already implement upload file with progress bar using asynctask but large files or uploading multiple files hang up my activity now i want to do the same but using service and not by using asynctask. 我已经使用asynctask使用进度条实现了上传文件,但是大文件或上传多个文件使我的活动挂起,现在我想这样做但使用服务而不是使用asynctask。 Here is my code.. 这是我的代码。

 private class UploadFileToServer extends AsyncTask<Void, Integer, String> {

        @Override
        protected void onPreExecute() {
            // setting progress bar to zero
            mBuilder.setProgress(100, 0, false);
            mNotifyManager.notify(0, mBuilder.build());
            super.onPreExecute();
        }

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

        @Override
        protected String doInBackground(Void... params) {
            return uploadFile();
        }

        private String uploadFile() {
            String responseString = null;

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(***);

            try {
                AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
                        new AndroidMultiPartEntity.ProgressListener() {
                            public void transferred(long num) {
                                publishProgress((int) ((num / (float) totalSize) * 100));
                            }
                        });

                File sourceFile = new File(orignal1);
                entity.addPart("image", new FileBody(sourceFile));
                totalSize = entity.getContentLength();
                httppost.setEntity(entity);

                // Making server call
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity r_entity = response.getEntity();

                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == 200) {
                    // Server response
                    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("Upload complete").setProgress(0, 0,false);
            mNotifyManager.notify(6532365, mBuilder.build());
            mNotifyManager.cancel(6532365);
            super.onPostExecute(result);
        }
    }

Use this Library 使用这个图书馆

https://github.com/gotev/android-upload-service https://github.com/gotev/android-upload-service

With this service you can show current progress and it will run in background which will help you maintain the performance of your application. 使用此服务,您可以显示当前进度,它将在后台运行,这将有助于您保持应用程序的性能。

Hey i finally did it here is the code 嘿,我终于做到了,这里是代码

public class UploadFile extends Service {

    NotificationManager mNotifyManager;
    NotificationCompat.Builder mBuilder;
    private static final String TAG = "HelloService";

    private boolean isRunning  = false;

    @Override
    public void onCreate() {
        Log.i(TAG, "Service onCreate");

        isRunning = true;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        mNotifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        mBuilder = new NotificationCompat.Builder(UploadFile.this);
        mBuilder.setContentTitle("File uploaded").setSmallIcon(
                R.drawable.myicons);
        UpadtePost();
        return Service.START_STICKY;
    }
    private void UpadtePost() {

        new UploadFileToServer().execute();
    }
    private class UploadFileToServer extends AsyncTask<Void, Integer, String> {

        protected void onPreExecute() {
            // setting progress bar to zero
            mBuilder.setProgress(100, 0, false);
            mNotifyManager.notify(0, mBuilder.build());
            super.onPreExecute();
        }

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

        @Override
        protected String doInBackground(Void... params) {
            return uploadFile();
        }

        private String uploadFile() {
            String responseString = null;

            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(****);

            try {
                AndroidMultiPartEntity entity = new AndroidMultiPartEntity(
                        new AndroidMultiPartEntity.ProgressListener() {
                            public void transferred(long num) {
                                publishProgress((int) ((num / (float) totalSize) * 100));
                            }
                        });

                File sourceFile = new File(orignal1);
                entity.addPart("image", new FileBody(sourceFile));
                totalSize = entity.getContentLength();
                httppost.setEntity(entity);

                // Making server call
                HttpResponse response = httpclient.execute(httppost);
                HttpEntity r_entity = response.getEntity();

                int statusCode = response.getStatusLine().getStatusCode();
                if (statusCode == 200) {
                    // Server response
                    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) {
                session.showNot(result);
                mBuilder.setContentText("Upload complete").setProgress(0, 0,false);
                mNotifyManager.notify(6532365, mBuilder.build());
                mNotifyManager.cancel(6532365);
            super.onPostExecute(result);
        }
    }
    @Override
    public IBinder onBind(Intent arg0) {
        Log.i(TAG, "Service onBind");
        return null;
    }

    @Override
    public void onDestroy() {

        isRunning = false;

        Log.i(TAG, "Service onDestroy");
    }
}

AndroidMultiPartEntity .java 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);
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM