comment utiliser praticable dans android
Salut, je suis débutant en Java, développement Android, et je veux savoir comment utiliser Runnable
dans Android. Il ne semble pas fonctionner pour moi. Voici mon code source:
MainTest.java
package com.heeere.androiddnssd.discovery;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainTest extends Activity {
android.net.wifi.WifiManager.MulticastLock lock;
private Discovery discovery = new Discovery(this);
private TextView textView;
/** Called when the activity is first created. */
@SuppressLint("NewApi") @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView)this.findViewById(R.id.text);
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);
lock = wifi.createMulticastLock("mylockthereturn");
lock.setReferenceCounted(true);
lock.acquire();
}
public void updateView () {
String msg = discovery.getMsg();
textView.setText(msg);
}
@SuppressLint("NewApi") @Override
protected void onStop() {
discovery.stop();
lock.release();
super.onStop();
}
}
Discovery.java
package com.heeere.androiddnssd.discovery;
import java.io.IOException;
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceListener;
public class Discovery {
private String type = "_ikunet._tcp.local.";
private String msg="";
private JmDNS jmdns = null;
private ServiceListener listener = null;
private MainTest maintest;
android.os.Handler handler = new android.os.Handler();
public Discovery (MainTest maintest) {
this.maintest = maintest;
setUp();
}
private void setUp() {
try {
jmdns = JmDNS.create();
jmdns.addServiceListener(type, listener = new ServiceListener() {
public void serviceResolved(ServiceEvent ev) {
msg = msg + ev.getInfo().getName()+ "\n";
update();
}
public void serviceRemoved(ServiceEvent ev) {
}
public void serviceAdded(ServiceEvent event) {
jmdns.requestServiceInfo(event.getType(), event.getName(), 1);
}
});
} catch (IOException e) {
e.printStackTrace();
return;
}
}
public String getMsg() {
return msg;
}
private void update() {
handler.postDelayed(new Runnable() {
public void run() {
maintest.updateView();
}
}, 1);
}
public void stop() {
if (jmdns != null) {
if (listener != null) {
jmdns.removeServiceListener(type, listener);
listener = null;
}
jmdns.unregisterAllServices();
try {
jmdns.close();
} catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
jmdns = null;
}
}
}
main.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroller"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:scrollbars="vertical"
android:fadeScrollbars="true"
android:isScrollContainer="true">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, Android Discovery" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>
</ScrollView>
La serviceResolved
est exécuté à partir de la Discovery
classe un certain temps après le démarrage de l'application et doit mettre à jour le textview
(à partir de MainTest
classe). Mais cela n'arrive pas. Comment puis-je corriger ce comportement? Je pense qu'il pourrait être un Runnable
problème.
Voulez-vous exécuter ur "serviceResolved" comme fond d'opération?
Juste écho à ce que les Annonces dit, il semble que vous faites tous les travaux sur le thread de l'INTERFACE utilisateur déjà, donc pas besoin de publier sur le thread de l'INTERFACE utilisateur. Cependant, il semble que vous l'intention de faire d'arrière-plan/multithread travail
le serviceResolved est automatiquement exécuté comme arrière-plan par Jmdns paquet
Juste écho à ce que les Annonces dit, il semble que vous faites tous les travaux sur le thread de l'INTERFACE utilisateur déjà, donc pas besoin de publier sur le thread de l'INTERFACE utilisateur. Cependant, il semble que vous l'intention de faire d'arrière-plan/multithread travail
le serviceResolved est automatiquement exécuté comme arrière-plan par Jmdns paquet
OriginalL'auteur MOHAMED | 2012-09-11
Vous devez vous connecter pour publier un commentaire.
Vous pouvez sauter à l'aide de
Runnable
comme il semble inutile dans Discovery.java. Par exemple:Toutefois, dans le cas où vous êtes à l'aide de fil de rassembler les résultats de la recherche ensuite ce que vous pouvez faire est de faire usage de
runOnUiThread
dans votre classe d'activité (MainTest.java). Par exemple:OriginalL'auteur waqaslam
essayer cette
Mais je vous recommande ceci:
OriginalL'auteur user1049280
Personnellement, je voudrais utiliser le gestionnaire d'un peu différemment.
Pour moi, le Gestionnaire doit être créé par l'Activité et remis à votre classe de découverte. C'est mieux parce que vous éviter une "fuite" de l'ensemble de l'Activité.
Dans l'activité que vous avez
Alors, si vous avez besoin de publier sur l'activité que vous pouvez utiliser quelque chose comme:
OriginalL'auteur pjco
Il fonctionne 🙂
OriginalL'auteur Woottipong Kongsib