2013-07-17 50 views
1

在我的Android應用程序中,我運行的服務減慢了我的應用程序的運行速度。我不知道是否有我選擇的最佳方式。我認爲這是因爲我使用sleep()函數每隔x秒檢查一次網站上是否有變化,但我絕對不確定這一點。這裏是代碼:如何在不減緩應用程序的情況下啓動服務?

package com.example.goo; 

//import 

    public class ServiceLive extends Service{ 

     ThreadDemo td = new ThreadDemo(); 

     String[] tabAllTeams; 
     String[] tabAllScores; 
     String code; 
     Document doc; 

     @Override 
     public IBinder onBind(Intent arg0) { 
      // TODO Auto-generated method stub 
      return null; 
     } 

     @Override 
     public void onCreate() { 
      super.onCreate(); 



      System.out.println("Lancement de mon service"); 
      td.run(); 
     } 

     public String[] getAllTeams(){ 
      return tabAllTeams; 
     } 

     public String[] getAllScores(){ 
      return tabAllScores; 
     } 

     private class ThreadDemo extends Thread{ 
      @Override 
      public void run() { 
       super.run(); 
       try{ 

        ThreadDemo.sleep(3000*10); 
        System.out.println("check again"); 
        new NetworkOperation().execute(); 
       }catch(Exception e){ 
        e.getMessage(); 
       } 
       new NetworkOperation().execute(); 
      } 
     } 

     //Get All Data 
     class NetworkOperation extends AsyncTask<Void, Void, String > { 
      protected String doInBackground(Void... params) { 
       try { 
        //Définir Site De Récupération 
        doc = Jsoup.connect("http://www.siteduzero.com").get(); 
        //Définir Classe de Récupération 
        Elements getId = doc.getElementsByClass("page-visitors"); 
        code = getId.text(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
       td.run(); 
       return null; 
      } 
     } 
    } 

什麼是減慢應用程序的部分?感謝的

SOLUTION:

檢查莫里斯·加文在這裏的答案:How to start service in new thread in android

+1

設置一些斷點並查看方法調用,分配等等需要多長時間。 – ChiefTwoPencils

+1

閱讀IntentService(http://developer.android.com/reference/android/app/IntentService.html)。我認爲它會做你想做的。否則,你必須使用AsyncTask或你自己的線程。 –

回答

1

您服務的主線程上運行的Thread。 該服務的主線程是同一個線程在活動UI線程..

爲此該Sleep呼叫在您的UI線程上運行.....

請啓動Thread.start()代替.run()

室內用.run()你將開始運行的線程,而不是線程本身裏面...

@Override 
    public void onCreate() { 
     super.onCreate(); 

     System.out.println("Lancement de mon service"); 
     td.start(); 
    } 
private class ThreadDemo extends Thread{ 
    @Override 
    public void run() { 
     super.run(); 
     try{ 

      ThreadDemo.sleep(3000*10); 
      System.out.println("check again"); 
      doInternetStuff(); 
     }catch(Exception e){ 
      e.getMessage(); 
     } 
     doInternetStuff(); 
    } 
} 

private void doInternetStuff() { 
    try { 
     //Définir Site De Récupération 
     doc = Jsoup.connect("http://www.siteduzero.com").get(); 
     //Définir Classe de Récupération 
     Elements getId = doc.getElementsByClass("page-visitors"); 
     code = getId.text(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    new ThreadDemo().start(); 
} 
+0

這是行不通的,因爲你必須從ui線程調用AsyncTask.execute()。如果他將啓動線程並嘗試在其中調用AsyncTask.execute,那麼他將得到一個異常。 –

+0

這是真的,不應該使用ASyncTask,那些東西也可以在線程內部執行。 –

+0

不確定要得到它... Lon Aalbers的答案會起作用嗎? – user1965878

1

你問題正是在這裏:

public void onCreate() { 
     super.onCreate(); 
     System.out.println("Lancement de mon service"); 
     td.run(); 
} 

服務不會運行在它自己的線程上,而是運行在您的應用程序主線程上。此外,運行不會啓動新線程,而是在正在進行呼叫的線程內運行Runnable對象的代碼。總結你在UI線程中完成所有工作。首先你應該撥打td.start(),我也會把這個代碼放在onStartCommand()而不是onCreate()。每次創建服務時都會調用一次onCreate(),但不是每次它收到一個意圖。 onStartCommand()代替由Service收到的每Intent運行。

相關問題