Je suis un étudiant qui essaie de créer une application pour mon mini-projet pour l'un de mes modules et j'essaie de créer une application qui saisit les données d'un serveur toutes les quelques secondes, donc mis à jour. J'ai essayé d'utiliser java timer et timerTask pour exécuter le code à plusieurs reprises, mais le programme ne s'exécute qu'une seule fois et le bouton get ne fonctionne pas comme prévu (supposons de saisir des données instantanément) après l'implémentation du timer. Android EmulatorTimer.schedule s'exécute une fois même avec période
public class MainActivity extends AppCompatActivity implements OnClickListener{
private Button speed;
private TextView result;
Timer timer;
TimerTask timerTask;
private TextView sSpeed;
final StringBuilder builder = new StringBuilder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
result = (TextView) findViewById(R.id.result);
sSpeed = (TextView) findViewById(R.id.sSpeed);
speed = (Button) findViewById(R.id.get_button);
speed.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View view) {
getWebsite();
}
});
View aboutButton = this.findViewById(R.id.about_button);
aboutButton.setOnClickListener(this);
View exitButton = this.findViewById(R.id.exit_button);
exitButton.setOnClickListener(this);
}
public void onClick(View v) {
switch (v.getId()){
case R.id.get_button:
getWebsite();
break;
case R.id.about_button:
Intent i = new Intent(this, About.class);
startActivity(i);
break;
case R.id.exit_button:
finish();
break;
}
}
private void getWebsite(){
new Thread(new Runnable() {
@Override
public void run() {
try{
Document doc = Jsoup.connect("http://10.0.2.2:8080/Start_Stop_buttons_UTF8.html").get();
// Elements element = doc.getElementsByTag("p");
Elements element = doc.select("p");
//String title = doc.title();
builder.append(title).append("\n");
for (Element tag : element){
builder.append("\n\n").append(tag.text());
}
}catch(IOException e){
//e.printStackTrace();
builder.append("Error : ").append(e.getMessage()).append("\n");
}
runOnUiThread(new Runnable() {
@Override
public void run() {
String a = builder.toString(); // parse data from html into new string
a = a.substring(a.indexOf(":")+1, a.indexOf("Control")).trim();//trim string content
String b = builder.toString();
b = b.substring(11,b.indexOf(":")+1).trim();
double speed = Double.parseDouble(a);//convert string into double
if (speed<1000)
Log.i("HTML text","too slow");
else if((speed> 1500))Log.i("HTML text","too fast!");
result.setText(a);
sSpeed.setText(b);
}
});
}
}).start();
}
protected void onResume() {
super.onResume();
startTimer();
}
public void startTimer(){
timer = new Timer();
timerTask = new TimerTask() {
@Override
public void run() {
getWebsite();
}
};
timer.schedule(timerTask,1500,3000);
}
public void stopTimer(){
if(timer != null){
timer.cancel();
timer.purge();
}
}
}
Suis-je mettre en œuvre la minuterie correctement pour exécuter getwebsite() à plusieurs reprises et en mesure d'obtenir une mise à jour instantanée lorsque get-bouton est cliqué comme il devrait avoir? Ou existe-t-il une meilleure façon d'implémenter ces fonctionnalités en utilisant une méthode différente?
Merci pour la réponse. Votre réponse pourrait s'avérer utile, mais je reçois toujours les mêmes erreurs: il n'est toujours pas mis à jour pour les changements dans les données affichées. J'ai essayé de modifier les données prévues pour être affichées sur le Web, mais cela ne s'affiche pas dans l'émulateur. Le problème réside-t-il dans le minuteur ou est-ce mes codes? –
En outre, quelle est la raison pour laquelle le bouton "get" ne répond pas à mes codes? –