【问题标题】:How to stop a thread in a service?after stopService method called? in Android如何停止服务中的线程?调用 stopService 方法后?在安卓中
【发布时间】:2015-07-23 04:40:05
【问题描述】:

使用服务上传图片

在我的应用程序中,我正在将图像上传到服务器,我使用后台服务来执行此操作,上传是在服务中的另一个线程中执行的。我已经读过,服务在 UI 线程上运行,而线程在服务是另一个进程,我需要的是,我想在单击按钮调用 stopService 时取消上传。所以我想杀死那个线程,我尝试了这段代码,但它不能正常工作。有人可以帮忙吗?请?

    private void uploadPhoto(Bitmap   bitmap) {
    //in this method you upload the photo to the server: omitted for brevity
    Log.e("Method", "uploadPhoto called");
    final Bitmap bit = bitmap;
    flag=true;

           uploadthread = new Thread(new Runnable() {

                    @Override
                    public void run() {

                        Log.e("While", "Inside while loop");
                        try {

                            while (true) {

                                if (flag) {
                                    Log.e("IF", "Inside IF condition"+flag);
                                     return;

                                    //uploadthread.destroy();
                                }
                                handler.sendEmptyMessage(0);
                                // t.sleep(5000);
                                // Toast.makeText(getApplicationContext(), "Horas",
                                // Toast.LENGTH_LONG).show();
                                Log.e("Upload", "Upload Started inside Thread");

                                HttpClient httpClient = new DefaultHttpClient();
                                HttpContext localContext = new BasicHttpContext();
                                HttpPost httpPost = new HttpPost(Config.FILE_UPLOAD_URL);

                                MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);


                                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                                bit.compress(Bitmap.CompressFormat.JPEG, 100, bos);
                                byte[] data = bos.toByteArray();


                                entity.addPart("uploaded_file", new ByteArrayBody(data,
                                        "myImage.jpg"));

                                httpPost.setEntity(entity);

                                HttpResponse response = httpClient.execute(httpPost,
                                        localContext);
                                BufferedReader reader = new BufferedReader(
                                        new InputStreamReader(
                                                response.getEntity().getContent(), "UTF-8"));

                                StringBuilder builder = new StringBuilder();
                                String aux = "";

                                while ((aux = reader.readLine()) != null) {
                                    builder.append(aux);
                                }

                                String sResponse = builder.toString();
                                handler.sendEmptyMessage(0);

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


                          //  stopSelf();
                        }


                });
                uploadthread.start();
              }

onDestroy 方法

 @Override
public void onDestroy() {
 try {
        handler.removeCallbacks(uploadthread);
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
    EndNotification();
    flag = false;
    Log.e("Service", "Service Destroyed");
    Toast.makeText(this, "Service Destroyed", Toast.LENGTH_LONG).show();
    super.onDestroy();


}

【问题讨论】:

    标签: java android multithreading android-service java-threads


    【解决方案1】:

    首先,不要使用线程,使用异步任务,这是处理网络和数据库调用等后台进程的最佳方式。

    对于从 UI 取消任何级别的异步任务,您可以使用cancel() 方法。

    Here 是 AsyncTask 的示例和 API。

    【讨论】:

    • 但是AsyncTask有一个问题,如果用户在上传过程中退出我的应用程序,我无法访问AsyncTask对象来取消上传
    • 您应该为异步任务创建一个独立的类,您将从 UI 级别调用它,因此当用户开始上传图像时,它将在后台运行,您可以使用 UI 执行任何操作,如果您的应用程序获取kill,异步任务会自动停止,你不用担心,如果你使用服务,服务会在后台运行,你不想在这里,所以使用服务使用异步任务。
    • 实际上,我需要取消上传,当用户点击应用程序上的进度通知时,即使用户退出应用程序,通知抽屉上也会有进度通知显示进度,我想要启用带有取消或继续按钮的警报对话框,如果用户单击取消按钮我想停止上传,但是如果活动被终止,我如何访问 AsyncTask 的对象以取消当时的上传过程?希望你理解我的问题。这就是我使用服务的原因
    【解决方案2】:

    你做得对。但是,如果我们将您的代码与https://stackoverflow.com/a/21982460/1384010 进行比较,我发现的唯一变化是在调用 super.onDestroy() 之前设置 flag=false。更新您的 onDestroy() 如下:-

    public void onDestroy() { 
        handler.removeCallbacks(t); 
        flag = false;
        super.onDestroy(); 
    } 
    

    希望对你有帮助!!

    【讨论】:

    • 你能检查我编辑的代码吗?问题还是没有解决。谢谢
    • 我不认为您的线程会通过删除回调来停止。尝试明确停止上传线程。比如:- if (uploadthread != null) { uploadthread .interrupt(); }
    • 我在 onDestroy 中调用了中断方法,但它还在上传文件,这是怎么回事???
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多