2016-09-01 9 views
-1

こんにちは、バックグラウンドでサービスを実行するコードです。それは正常に動作しています。しかし、操作が終了しても停止することはありません。ここに私のコードです。私は一度データがサーバーに送信され、私はsqliteとmythread.stop()のデータを削除するdeleteメソッドを呼び出しているサービスを停止することはできません。スレッドを停止しますが、停止していません。誰がスレッドを停止するかは、そのための解決策です。 onDestryバックグラウンドで実行中のスレッドサービスを停止するAndroidコード

public class ServiceTest extends Service { 

    List<NameValuePair> nameValuePairs; 

    String timerss=null,additional=null; 

    String loc=null; 

    int localUname = 0; 

    String sno; 

    String deviceid; 

    List<Contact> contacts; 

    private static String TAG = ServiceTest.class.getSimpleName(); 
    private MyThread mythread; 
    public boolean isRunning = false; 

    @Override 
    public IBinder onBind(Intent arg0) { 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.d(TAG, "onCreate"); 
     mythread = new MyThread(); 
    } 

    @Override 
    public synchronized void onDestroy() { 
     super.onDestroy(); 
     Log.d(TAG, "onDestroy"); 
     if(!isRunning){ 
      mythread.interrupt(); 
      mythread.stop(); 
     } 
    } 

    @Override 
    public synchronized void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 
     Log.d(TAG, "onStart"); 
     if(!isRunning){ 
      mythread.start(); 
      isRunning = true; 
     } 
    } 

    public void readWebPage(){ 
     DatabaseHandler db = new DatabaseHandler(ServiceTest.this); 
     contacts = db.getAllContacts(); 
     for (Contact cn : contacts) { 
      String log = " USERNAME: " 
        + cn.getID() + " ,loc: " +cn.getName(); 

      localUname = cn.getID(); 
      sno = String.valueOf(localUname); 
      loc = cn.getName(); 
      timerss = cn.getPhoneNumber(); 
//   deviceid = cn.getMacId(); 
//   additional = cn.getAdditonal(); 

      System.out.println("benbenarji:" + localUname + loc+timerss+deviceid+additional); 

      System.out.println("benbenarji1:" + localUname + loc); 

     } 
     try { 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://ip:80808/ActIotWifiLockApp/LockWebServices/storeLogForUD"); 
      //add your data 
      nameValuePairs = new ArrayList<NameValuePair>(4); 
      nameValuePairs.add(new BasicNameValuePair("slno", sno)); 
      nameValuePairs.add(new BasicNameValuePair("macId", deviceid)); 
      nameValuePairs.add(new BasicNameValuePair("logdesc", additional)); 
      System.out.println("logdes:" + additional); 
      nameValuePairs.add(new BasicNameValuePair("dateTime", "timerss")); 
      nameValuePairs.add(new BasicNameValuePair("username", "loc")); 

      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      //Execute HTTP Post Request 
      ResponseHandler<String> responseHandler = new BasicResponseHandler(); 
      final String response = httpclient.execute(httppost, responseHandler); 

      System.out.println("ResponseScan: " + response); 

//   runOnUiThread(new Runnable() { 
//    public void run() { 
// 
//     dialog.dismiss(); 
//    } 
//   }); 

      if (response.contains("true")) { 

       db.deleteAllData(); 
       mythread.interrupt(); 
       mythread.stop(); 

      } else { 
       Log.e("ServiceHandler", "Couldn't get any data from the url"); 
      } 

     } catch (Exception e) { 
      System.out.println("Exception : " + e.getMessage()); 
     } 
    } 

    class MyThread extends Thread{ 
     static final long DELAY = 10000; 
     @Override 
     public void run(){ 
      System.out.println("ben:"+isRunning); 
      while(isRunning){ 
       Log.d(TAG,"Running"); 
       try { 
        readWebPage(); 
        Thread.sleep(DELAY); 
       } catch (InterruptedException e) { 
        isRunning = false; 
        e.printStackTrace(); 
       } 
      } 
     } 

    } 

} 

答えて

0

あなたの実装では、

if(!isRunning){ 

が、それはあなたが言う必要があるということでした行が含まれています。私はあなたがisRunningがある場合、スレッドを停止するとしているため

if(isRunning){ 

true 。このほかに

、マニュアルは、次のを思い出させてくれる:

その作業が行われたときstopSelf()またはstopService()を呼び出すことにより、サービスを停止するにはあなたの責任です。

関連する問題