>

서비스를 중지하려고했지만파기방법도 실행되었지만 서비스가 중지되지 않았습니다. 최선을 다했습니다. 도와주세요.

내 코드는 아래에 언급되어 있습니다 :

주요 활동

<올>
  • 의도 의도 = 새로운 의도 (this, Myservice.class);
       startService (의도);// 시작 버튼에서

  • 의도 의도 = 새로운 의도 (this, Myservice.class);
         stopService (의도);// 정지 버튼.

  • 내 서비스

    public class Myservice extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    @Override
    public void onCreate() {
        super.onCreate();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Toast.makeText(this,"runing",Toast.LENGTH_LONG).show();
         {
             myTherad th=new myTherad();
             Thread thread=new Thread(th);
             thread.start();
    
         }
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public void onDestroy() {
        Toast.makeText(this,"stop",Toast.LENGTH_LONG).show();
        super.onDestroy();
    }
    class myTherad implements Runnable {
        @Override
        public void run() {
            synchronized (this)
            {
                try {
                    for(int i=0;i<10;i++)
                    {
                        wait(1000);
                        Log.d("mfnhsdgjkfn","===="+String.valueOf(i));
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            stopSelf();
    
        }
    
    }
    
    

    }

    • 답변 # 1

      귀하의 서비스는 중단되었지만 Thread 는 아닙니다 . onDestroy 에서 스레드를 취소하십시오.  예를 들어 어떤 종류의 상태 변수 :

      class myTherad implements Runnable {
           // Indicates that the runnable should stop. 
           private boolean shouldStop = false;
           @Override
           public void run() {
              synchronized (this)
              {
                  try {
                      for(int i=0;i<10 && !shouldStop;i++)
                      {
                          wait(1000);
                          Log.d("mfnhsdgjkfn","===="+String.valueOf(i));
                      }
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
              stopSelf();
      
        }
      
      

      실행 가능 파일을 클래스 속성으로 선언하십시오 :

      private myTherad runnable;
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
          runnable=new myTherad();
          Thread thread=new Thread(runnable);
          thread.start();
          return super.onStartCommand(intent, flags, startId);
      }
      
      

      onDestroy 내에서 실행 파일을 중지하고

      :

      @Override
      public void onDestroy() {
          Toast.makeText(this,"stop",Toast.LENGTH_LONG).show();
          runnable.shouldStop = true;
          super.onDestroy();
      }
      
      

      적어도 최신 wait 이후  실행되면 스레드가 중지됩니다. 중단없이이를 최적화 할 수 있습니다.

    • 답변 # 2

      실행중인 스레드를 방해해야합니다. thread.interrupt()  그렇게하고 java.lang.InterruptedException 를 줄 것이다  , 아래 코드를 사용해보십시오 :

      public class MyService extends Service {
      public MyService() {}
      myTherad th;
      Thread thread;
      @Nullable
      @Override
      public IBinder onBind(Intent intent) {
          return null;
      }
      @Override
      public void onCreate() {
          super.onCreate();
      }
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
          Toast.makeText(this,"runing",Toast.LENGTH_LONG).show();
          {
               th=new myTherad();
               thread=new Thread(th);
               thread.start();
          }
          return super.onStartCommand(intent, flags, startId);
      }
      @Override
      public void onDestroy() {
          super.onDestroy();
          Toast.makeText(this,"stop",Toast.LENGTH_LONG).show();
          thread.interrupt();
      }
      class myTherad implements Runnable {
          @Override
          public void run() {
              synchronized (this)
              {
                  try {
                      for(int i=0;i<10;i++)
                      {
                          wait(1000);
                          Log.d("LOG","===="+String.valueOf(i));
                      }
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
              stopSelf();
          }
      }
      }
      
      

  • 이전 reactjs - React에서 자식 구성 요소 클래스를 부모 구성 요소에 소품으로 전달
  • 다음 java : 동일한 대체 위치의 LinkedHashMap에서 전체 키 /값 쌍을 대체하는 방법