Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Volley plus或OkHttp的Android更新通知服务进度_Android_Multithreading_Android Service_Android Volley_Okhttp3 - Fatal编程技术网

使用Volley plus或OkHttp的Android更新通知服务进度

使用Volley plus或OkHttp的Android更新通知服务进度,android,multithreading,android-service,android-volley,okhttp3,Android,Multithreading,Android Service,Android Volley,Okhttp3,我需要你的帮助!我正在尝试更新回调文件上载过程状态栏中的进度栏。我尝试了两个,当调用更新进度条接口时,这两个网络库都会导致系统冻结。我理解这意味着基本上回调过程在主线程中工作,而不管我在服务中运行它们。如何正确调用更新进度条,以免导致系统UI冻结 注意:如果我在主线程(活动)中更新通知,所有工作正常!两个示例都正常工作,服务器按预期接收文件 OkHTTP代码在服务中 mUBuilder.setContentTitle("Upload image") .setContentText("")

我需要你的帮助!我正在尝试更新回调文件上载过程状态栏中的进度栏。我尝试了两个,当调用更新进度条接口时,这两个网络库都会导致系统冻结。我理解这意味着基本上回调过程在主线程中工作,而不管我在服务中运行它们。如何正确调用更新进度条,以免导致系统UI冻结

注意:如果我在主线程(活动)中更新通知,所有工作正常!两个示例都正常工作,服务器按预期接收文件

OkHTTP代码在服务中

mUBuilder.setContentTitle("Upload image")
    .setContentText("")
    .setAutoCancel(false)
    .setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT))
    .setSmallIcon(R.drawable.ic_launcher);
try {
    final File file = new File(IMAGE_PATH);
    final long totalSize = file.length();
    RequestBody requestBody = new MultipartBody.Builder()
        .addPart(Headers.of("Content-Disposition", "form-data; name=\"image\"; filename=\"" + file.getName() + "\""),
            new CountingFileRequestBody(file, "image/*", new CountingFileRequestBody.ProgressListener() {
            @Override
                                public void transferred(long num) {
                                    final float progress = (num / (float) totalSize) * 100;
                                    Log.d(TAG, "OUT THREAD: " + progress); //see in logs
                                    new Thread(
                                            new Runnable() {
                                                @Override
                                                public void run() {
                                                    Log.d(TAG, "IN THREAD: " + progress); //not visible in the logs
                                                    mUBuilder.setProgress(100,(int) progress, false);
                                                    mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF, mUBuilder.build());
                                                }
                                            }
                                    );
                                }
                            }))
                    .build();

            Request request = new Request.Builder()
                    .url("http://posttestserver.com/post.php?dir=123")
                    .post(requestBody)
                    .build();

            client.newCall(request).enqueue(new Callback() {
                @Override public void onFailure(Call call, IOException e) {
                    e.printStackTrace();
                }

                @Override public void onResponse(Call call, Response response) throws IOException {
                    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

                    Headers responseHeaders = response.headers();
                    for (int i = 0, size = responseHeaders.size(); i < size; i++) {
                        System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));
                    }
                    mUBuilder.setContentTitle("Upload complete!");
                    mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF, mUBuilder.build());
                    System.out.println(response.body().string());
                }
            });
        }catch(Exception e){
            e.printStackTrace();
        }
mUBuilder.setContentTitle(“上传图像”)
.setContentText(“”)
.setAutoCancel(错误)
.setContentIntent(PendingEvent.getActivity(getApplicationContext(),0,notificationIntent,PendingEvent.FLAG_UPDATE_CURRENT))
.setSmallIcon(R.drawable.ic_发射器);
试一试{
最终文件=新文件(图像路径);
最终长totalSize=file.length();
RequestBody RequestBody=新的MultipartBody.Builder()
.addPart(Headers.of(“内容处置”,“表单数据;名称=\”图像\“文件名=\”+文件.getName()+”\”),
new CountingFileRequestBody(文件“image/*”,new CountingFileRequestBody.ProgressListener(){
@凌驾
已转移的公共无效(长数值){
最终浮动进度=(num/(浮动)totalSize)*100;
d(标记“OUT THREAD:+progress);//在日志中查看
新线程(
新的Runnable(){
@凌驾
公开募捐{
Log.d(标记“IN-THREAD:+progress);//在日志中不可见
mUBuilder.setProgress(100,(int)progress,false);
mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF,mUBuilder.build());
}
}
);
}
}))
.build();
Request Request=newrequest.Builder()
.url(“http://posttestserver.com/post.php?dir=123")
.post(请求主体)
.build();
client.newCall(request).enqueue(new Callback()){
@覆盖公共void onFailure(调用,IOE异常){
e、 printStackTrace();
}
@重写公共void onResponse(调用调用、响应响应)引发IOException{
如果(!response.issusccessful())抛出新IOException(“意外代码”+响应);
Headers responseHeaders=response.Headers();
for(int i=0,size=responseHeaders.size();i
从中计算FileRequestBody.java

截击加密码

mNotifyManager = (NotificationManager) getApplicationContext().getSystemService(Context.NOTIFICATION_SERVICE);
        notificationIntent = new Intent(getApplicationContext(), NMainActivity.class);
        final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(getApplicationContext());
        mBuilder.setContentTitle("Upload image")
                .setContentText("")
                .setAutoCancel(false)
                .setContentIntent(PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT))
                .setSmallIcon(R.drawable.ic_launcher);
        SimpleMultiPartRequest jsonRequest = new SimpleMultiPartRequest(Request.Method.POST, "http://posttestserver.com/post.php?dir=123",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.i(getClass().getName(), response);
                        mBuilder.setContentText("Upload image complete!");
                        mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF, mBuilder.build());
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e(getClass().getName(), error.toString());
            }
        }) {

            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                return mParams;
            }

        };
        jsonRequest.addFile("images", (IMAGE_PATH);
        jsonRequest.setFixedStreamingMode(true);
        jsonRequest.setShouldCache(false);
        jsonRequest.setShouldRetryServerErrors(true);
        jsonRequest.setOnProgressListener(new Response.ProgressListener() {
            @Override
            public void onProgress(long transferredBytes, long totalSize) {
                final int percentage = (int) ((transferredBytes / ((float) totalSize)) * 100);
                mBuilder.setProgress(100, percentage, false);
                mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF, mBuilder.build());
//freeze system UI
            }
        });
        mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        mRequestQueue.add(jsonRequest);
        mRequestQueue.start();
mNotifyManager=(NotificationManager)getApplicationContext().getSystemService(Context.NOTIFICATION_服务);
notificationIntent=新意图(getApplicationContext(),NMainActivity.class);
final NotificationCompat.Builder mBuilder=new NotificationCompat.Builder(getApplicationContext());
mBuilder.setContentTitle(“上传图像”)
.setContentText(“”)
.setAutoCancel(错误)
.setContentIntent(PendingEvent.getActivity(getApplicationContext(),0,notificationIntent,PendingEvent.FLAG_UPDATE_CURRENT))
.setSmallIcon(R.drawable.ic_发射器);
SimpleMultiPartRequest jsonRequest=新的SimpleMultiPartRequest(Request.Method.POST,“http://posttestserver.com/post.php?dir=123",
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
Log.i(getClass().getName(),响应);
setContentText(“上传图像完成!”);
mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF,mBuilder.build());
}
},new Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Log.e(getClass().getName(),error.toString());
}
}) {
@凌驾
受保护的映射getParams()引发AuthFailureError{
返回内存;
}
};
jsonRequest.addFile(“图像”,(图像路径);
setFixedStreamingMode(true);
jsonRequest.setShouldCache(false);
jsonRequest.setShouldRetryServerErrors(true);
jsonRequest.setOnProgressListener(新响应.ProgressListener(){
@凌驾
public void onProgress(长transferredBytes,长totalSize){
最终整数百分比=(整数)((transferredBytes/(float)totalSize))*100;
mBuilder.setProgress(100,百分比,假);
mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF,mBuilder.build());
//冻结系统用户界面
}
});
mRequestQueue=Volley.newRequestQueue(getApplicationContext());
mRequestQueue.add(jsonrequeue
@Override
public void transferred(final int progress) {
    handler.post(new Runnable() {
        @Override
        public void run() {
            mUBuilder.setProgress(100, progress, true);
            mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF, mUBuilder.build());
        }
    });
}
public class CountingFileRequestBody extends RequestBody {
    ...
    int latestPercentDone, percentDone;
    ...
    @Override
    public void writeTo(BufferedSink sink) throws IOException {
        ...
        while ((read = source.read(sink.buffer(), SEGMENT_SIZE)) != -1) {
            total += read;
            sink.flush();
            latestPercentDone = (int) ((total / (float) file.length()) * 100);
            if (percentDone != latestPercentDone) {
                percentDone = latestPercentDone;
                this.listener.transferred(percentDone);
            }
        }
    }
    public interface ProgressListener {
        void transferred(int num);
    }
}
jsonRequest.setOnProgressListener(new Response.ProgressListener() {
            int latestPercentDone, percentDone;
            @Override
            public void onProgress(long transferredBytes, long totalSize) {
                latestPercentDone = (int) ((transferredBytes / (float) totalSize) * 100);
                if (percentDone != latestPercentDone) {
                    percentDone = latestPercentDone;
                    mUBuilder.setProgress(100, percentDone, false);
                    mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF, mUBuilder.build());
                }
            }
        });
final File file = new File(event.getPath().getPath());
final long totalSize = file.length();

new AsyncTask<Void, Integer, String>() {
    @Override
    protected void onProgressUpdate(Integer... values) {
        mUBuilder.setProgress(100, values[0], false);
        mNotifyManager.notify(AppSettings.SEND_DATA_NOTIF, mUBuilder.build());
    }

    @Override
    protected String doInBackground(Void... voids) {
        try{
            final File file = new File(event.getPath().getPath());
            final long totalSize = file.length();

            HttpClient client = new DefaultHttpClient();
            HttpPost post = new HttpPost("http://posttestserver.com/post.php?dir=123");
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
            builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);

            FileBody fb = new FileBody(file);

            builder.addPart("file", fb);
            final HttpEntity yourEntity = builder.build();
            class ProgressiveEntity implements HttpEntity {
                @Override
                public void consumeContent() throws IOException {
                    yourEntity.consumeContent();
                }

                @Override
                public InputStream getContent() throws IOException,
                        IllegalStateException {
                    return yourEntity.getContent();
                }

                @Override
                public Header getContentEncoding() {
                    return yourEntity.getContentEncoding();
                }

                @Override
                public long getContentLength() {
                    return yourEntity.getContentLength();
                }

                @Override
                public Header getContentType() {
                    return yourEntity.getContentType();
                }

                @Override
                public boolean isChunked() {
                    return yourEntity.isChunked();
                }

                @Override
                public boolean isRepeatable() {
                    return yourEntity.isRepeatable();
                }

                @Override
                public boolean isStreaming() {
                    return yourEntity.isStreaming();
                } 

                @Override
                public void writeTo(OutputStream outstream) throws IOException {

                    class ProxyOutputStream extends FilterOutputStream {
                        public ProxyOutputStream(OutputStream proxy) {
                            super(proxy);
                        }

                        public void write(int idx) throws IOException {
                            out.write(idx);
                        }

                        public void write(byte[] bts) throws IOException {
                            out.write(bts);
                        }

                        public void write(byte[] bts, int st, int end) throws IOException {
                            out.write(bts, st, end);
                        }

                        public void flush() throws IOException {
                            out.flush();
                        }

                        public void close() throws IOException {
                            out.close();
                        }
                    } 

                    class ProgressiveOutputStream extends ProxyOutputStream {
                        long totalSent;
                        int latestPercentDone, percentDone;

                        public ProgressiveOutputStream(OutputStream proxy) {
                            super(proxy);
                            totalSent = 0;
                        }

                        public void write(byte[] bts, int st, int end) throws IOException {

                            totalSent += end;
                            latestPercentDone = (int) ((totalSent / (float) totalSize) * 100);
                            if (percentDone != latestPercentDone) {
                                percentDone = latestPercentDone;
                                publishProgress(percentDone);
                            }

                            out.write(bts, st, end);
                        }
                    }

                    yourEntity.writeTo(new ProgressiveOutputStream(outstream));
                }
            }

            ProgressiveEntity myEntity = new ProgressiveEntity();

            post.setEntity(myEntity);
            HttpResponse response = client.execute(post);
            Log.d(TAG, response.toString());

        }catch(Exception e){
            e.printStackTrace();
        }
        return null;
    }

}.execute();
android {
    useLibrary 'org.apache.http.legacy'
}
dependencies {
    ...
    compile('org.apache.httpcomponents:httpcore:+') {
        exclude module: "httpclient"
    }
    compile('org.apache.httpcomponents:httpmime:4.3.6') {
        exclude module: "httpclient"
    }
    ...
}