Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.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
Java 如何停止服务中的线程?调用stopService方法后?在Android中 使用服务上传图像_Java_Android_Multithreading_Android Service_Java Threads - Fatal编程技术网

Java 如何停止服务中的线程?调用stopService方法后?在Android中 使用服务上传图像

Java 如何停止服务中的线程?调用stopService方法后?在Android中 使用服务上传图像,java,android,multithreading,android-service,java-threads,Java,Android,Multithreading,Android Service,Java Threads,在我的应用程序中,我正在将一个图像上传到服务器,我使用了后台服务,上传在服务中的另一个线程中执行。我读到,服务在UI线程上运行,服务中的线程是另一个进程,我需要的是,当点击按钮调用stopService时,我想取消上载。因此我想终止该线程,我尝试了此代码,但它无法正常工作。有人能帮忙吗?请 private void uploadPhoto(Bitmap bitmap) { //in this method you upload the photo to the server:

在我的应用程序中,我正在将一个图像上传到服务器,我使用了后台服务,上传在服务中的另一个线程中执行。我读到,服务在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();
              }
探空法

 @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();


}

首先,不要使用线程,而是使用异步任务,这是处理后台进程(如网络和数据库调用)的最佳方法

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


是AsyncTask的示例和API。

首先,不要使用线程,使用Async Task,这是处理后台进程(如网络和数据库调用)的最佳方法

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


是AsyncTask的示例和API。

您做得对。但如果我们将您的代码与答案进行比较,我发现唯一的更改是在调用super.ondestory()之前设置flag=false。更新您的ondestory(),如下所示:-


希望这对你有帮助

你做得对。但如果我们将您的代码与答案进行比较,我发现唯一的更改是在调用super.ondestory()之前设置flag=false。更新您的ondestory(),如下所示:-


希望这对你有帮助

但是AsyncTask有一个问题,如果用户在上传过程中退出我的应用程序,我无法访问AsyncTask对象来取消上传您应该为异步任务创建一个独立类,您将从UI级别调用该类,因此当用户开始上传图像时,它将在后台运行,您可以使用UI执行任何操作,如果您的应用程序被杀死,异步任务将自动停止,您不必担心,如果您使用服务,服务将在后台运行,而您不希望在这里运行,因此使用服务使用异步任务。实际上,当用户单击应用程序上的进度通知时,我需要取消上载,因此即使用户退出应用程序,通知抽屉上会有一个进度通知来显示进度,我想启用一个带有“取消”或“继续”按钮的警报对话框,如果用户单击“取消”按钮,我想停止上载,但是如果活动被终止,我如何访问AsyncTask的对象来取消上载过程呢??希望你理解我的问题。这就是为什么我使用了服务,但AsyncTask有一个问题,如果用户在上传过程中退出我的应用程序,我无法访问AsyncTask对象来取消上传。你应该为异步任务创建一个独立类,你将从UI级别调用该类,因此当用户开始上传图像时,它将在后台运行,你可以用UI做任何事情,如果你的应用程序被杀死,异步任务将自动停止,你不必担心,如果你使用服务,服务将在后台运行,而你不想在这里运行,所以使用服务使用异步任务。实际上,我需要取消上传,当用户单击应用程序上的进度通知时,即使用户退出应用程序,也会在通知抽屉上显示进度通知,我想启用带有“取消”或“继续”按钮的警报对话框,如果用户单击“取消”按钮,我想停止上载,但如果活动被终止,我如何访问AsyncTask的对象以取消当时的上载过程??希望你能理解我的问题。这就是我使用服务的原因。你能检查我编辑的代码吗??问题仍然没有解决。谢谢。我认为你的线程不会因为删除回调而停止。尝试显式停止uploadthread。比如:-如果(uploadthread!=null){uploadthread.interrupt();}我在onDestroy中调用了中断方法,但它仍在上载文件,实际发生了什么?让我们试试这个:-你能检查我编辑的代码吗??问题仍然没有解决。谢谢。我认为你的线程不会因为删除回调而停止。尝试显式停止uploadthread。比如:-如果(uploadthread!=null){uploadthread.interrupt();}我在onDestroy中调用了中断方法,但它仍在上载文件,实际发生了什么?让我们试试这个:-
public void onDestroy() { 
    handler.removeCallbacks(t); 
    flag = false;
    super.onDestroy(); 
}