2013-07-17 53 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运行。

相关问题