Java 如何在不降低应用程序速度的情况下启动服务?

Java 如何在不降低应用程序速度的情况下启动服务?,java,android,performance,service,Java,Android,Performance,Service,在我的Android应用程序中,我运行的一项服务大大降低了我的应用程序的速度。我不知道是否有我选择的最好的方法。我想这是因为我使用sleep()函数每x秒检查一次网站上是否有变化,但我绝对不能确定这一点。代码如下: package com.example.goo; //import public class ServiceLive extends Service{ ThreadDemo td = new ThreadDemo(); Stri

在我的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;
            }
        }
    }
package com.example.goo;
//进口
公共类ServiceLive扩展服务{
ThreadDemo td=新的ThreadDemo();
字符串[]tabAllTeams;
字符串[]tabAllScores;
字符串代码;
文件文件;
@凌驾
公共IBinder onBind(意图arg0){
//TODO自动生成的方法存根
返回null;
}
@凌驾
public void onCreate(){
super.onCreate();
System.out.println(“Lancement de mon服务”);
td.run();
}
公共字符串[]getAllTeams(){
返回Taball团队;
}
公共字符串[]getAllScores(){
返回tabAllScores;
}
私有类ThreadDemo扩展了线程{
@凌驾
公开募捐{
super.run();
试一试{
ThreadDemo.sleep(3000*10);
System.out.println(“再次检查”);
新建网络操作().execute();
}捕获(例外e){
e、 getMessage();
}
新建网络操作().execute();
}
}
//获取所有数据
类NetworkOperation扩展了异步任务{
受保护字符串doInBackground(无效…参数){
试一试{
//杯赛现场装饰
doc=Jsoup.connect(“http://www.siteduzero.com).get();
//最后一杯咖啡
元素getId=doc.getElementsByClass(“页面访问者”);
code=getId.text();
}捕获(例外e){
e、 printStackTrace();
}
td.run();
返回null;
}
}
}
什么部分会减慢应用程序的速度?谢谢

解决方案:


在这里检查Maurice Gavin的答案:

您正在服务的主线程上运行
线程。
服务的主线程与活动中的UI线程相同

因此,
Sleep
调用正在UI线程上运行

请使用
.start()
而不是
.run()
启动
线程

Wiht
.run()
您将在线程内部启动runnable,而不是线程本身

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

你的问题就在这里:

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

服务不是在自己的线程上运行,而是在应用程序主线程上运行。此外,run不会启动新线程,而是在进行调用的线程内运行
Runnable
对象的代码。总结一下,您正在UI线程中完成所有工作。首先,您应该调用
td.start()
,我还要将此代码放入
onStartCommand()
而不是
onCreate()
onCreate()
在每次创建服务时调用,但不是每次收到意图时调用
onStartCommand()
而是为
服务
接收到的每个
Intent
运行设置一些断点,并查看方法调用、分配等之间的间隔时间。阅读有关IntentService()的信息。我想它会满足你的要求。否则,您必须使用AsyncTask或您自己的线程。这将不起作用,因为您必须从ui线程调用AsyncTask.execute()。如果他将启动线程并尝试在其中调用AsyncTask.execute,那么他将得到一个异常。这是真的,不应该使用AsyncTask,这些东西也可以在线程内执行..编辑,现在应该可以工作了。你不必使用单独的AsyncTaskThank,我要试试。我试过你的代码,速度还是很慢,但我找到了解决问题的方法。Maurice Gavin()的解决方案非常有效。谢谢你的回答