在我的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的答案:How to start service in new thread in android
答案 0 :(得分:1)
您正在服务的主线程上运行Thread
。
服务的主线程与您活动中的UI线程是同一个线程。
因此,Sleep
调用正在您的UI线程上运行.....
请使用Thread
代替.start()
.run()
如果.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();
}
答案 1 :(得分:1)
你的问题就在这里:
public void onCreate() {
super.onCreate();
System.out.println("Lancement de mon service");
td.run();
}
服务不在自己的线程上运行,而是在应用程序主线程上运行。此外,run不会启动新线程,而是在正在进行调用的线程内运行Runnable
对象的代码。总结一下,你正在UI线程中完成所有工作。首先,您应该致电td.start()
,我也会将此代码放在onStartCommand()
而不是onCreate()
。每次创建服务时都会调用onCreate()
,但每次收到Intent时都不会调用onStartCommand()
。 Intent
代替Service
收到的每{{1}}次。