在我的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;
}
}
}
减缓应用程序速度的部分是什么?谢谢
解决方案:
在这里查看Maurice Gavin的答案:如何在android 的新线程中启动服务
您正在服务的主线程上运行Thread
。服务的主线程与活动中的UI线程是同一个线程。。
因此,Sleep
调用正在UI线程上运行。。。。。
请用.start()
而不是.run()
启动Thread
使用.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();
}
您的问题就在这里:
public void onCreate() {
super.onCreate();
System.out.println("Lancement de mon service");
td.run();
}
服务不在自己的线程上运行,而是在应用程序主线程上运行。此外,run不启动新线程,而是在进行调用的线程内运行Runnable
对象的代码。最后,您将在UI线程中完成所有工作。首先,你应该调用td.start()
,我也会把这个代码放在onStartCommand()
而不是onCreate()
中。CCD_ 11在每次创建服务时被调用一次,但不是每次接收Intent时都被调用。CCD_ 12针对由CCD_ 14接收到的每个CCD_。