Bonjour,

je suis en train de développer une première application simple sous Android :

le but est de décupérer des informations via UPnP et de mettre à jour l'affichage en tenant compte de ces données.

Pour le moment, comme je découvre Android, je reste sur un simple affichage de text envoyé via un service UPnP.

Mon problème est que le thread envoyant les informations UPnP n'est pas le même que celui d'affichage.
Et je n'arrive pas faire un refresh de ma TextView.
J'aurai donc besoin d'un coup de main pour me sortir de ce bourbier!!!

Voici ce que j'ai déjà essayé

J'ai essayé avec un handler:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
TextView text = (TextView) findViewById(R.id.temp);
...
text.getHandler().post(new Runnable() {
 
   @Override
   public void run() {
   // TODO Auto-generated method stub
   text.refreshDrawableState();
   }
});
Cela ne fonctionne pas

J'ai essayé avec des messages :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
public class MyClass extends Activity {
        ...
        public static final int MESSAGE_REFRESH = 1;
	private View viewToRefresh;
        private TextView MyTextView;
        private MyrefreshHandler handler;
 
	public class MyrefreshHandler extends Handler{
		@Override
		public void handleMessage(Message m){
			switch (m.what) {
			case TemperatureDisplay.MESSAGE_REFRESH:
				Log.d("????????????????", "ok");
				TemperatureDisplay.this.viewToRefresh.invalidate();
				break;
 
			default:
				break;
			}
		}
	}
 
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
 
                // active le wifi
		WifiManager wm=(WifiManager)getSystemService(WIFI_SERVICE);
		lock = wm.createMulticastLock("mylock");
		lock.acquire();
 
 
		try {
 
			TextView MyTextView = (TextView) findViewById(R.id.temp);
			this.viewToRefresh = MyTextView;
			handler = new MyrefreshHandler();
                        ...
		} catch (InvalidDescriptionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
 
...
 
         public void updateValue(String value)
			{
				MyTextView.setText(value);
				try{
					Message message = new Message();
					message.what = MyClass.MESSAGE_REFRESH;
				        this.handler.handleMessage(message);
				}catch(Exception e){
					e.printStackTrace();
				}
				System.out.println("+++++ value updated");
			}
Cela ne fonctionne toujours pas et voici un message d'erreur que je peux avoir dans les log trace :
10-08 10:12:25.540: WARN/System.err(10579): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
10-08 10:12:25.540: WARN/System.err(10579): at android.view.ViewRoot.checkThread(ViewRoot.java:2683)
10-08 10:12:25.540: WARN/System.err(10579): at android.view.ViewRoot.invalidateChild(ViewRoot.java:570)
10-08 10:12:25.540: WARN/System.err(10579): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:596)
10-08 10:12:25.540: WARN/System.err(10579): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2392)
10-08 10:12:25.540: WARN/System.err(10579): at android.view.View.invalidate(View.java:4945)
10-08 10:12:25.540: WARN/System.err(10579): at ambiantComp.android.temperatureDisplay.TemperatureDisplay$MyrefreshHandler.handleMessage(TemperatureDisplay.java:37)
10-08 10:12:25.540: WARN/System.err(10579): at ambiantComp.android.temperatureDisplay.TemperatureDevice.updateTemperature(TemperatureDevice.java:220)
10-08 10:12:25.540: WARN/System.err(10579): at ambiantComp.android.temperatureDisplay.TemperatureDevice.actionControlReceived(TemperatureDevice.java:174)
10-08 10:12:25.540: WARN/System.err(10579): at org.cybergarage.upnp.Action.performActionListener(Action.java:334)
10-08 10:12:25.540: WARN/System.err(10579): at org.cybergarage.upnp.Device.deviceActionControlRecieved(Device.java:1668)
10-08 10:12:25.540: WARN/System.err(10579): at org.cybergarage.upnp.Device.deviceControlRequestRecieved(Device.java:1632)
10-08 10:12:25.540: WARN/System.err(10579): at org.cybergarage.upnp.Device.soapActionRecieved(Device.java:1617)
10-08 10:12:25.548: WARN/System.err(10579): at org.cybergarage.upnp.Device.httpPostRequestRecieved(Device.java:1594)
10-08 10:12:25.548: WARN/System.err(10579): at org.cybergarage.upnp.Device.httpRequestRecieved(Device.java:1524)
10-08 10:12:25.548: WARN/System.err(10579): at ambiantComp.android.temperatureDisplay.TemperatureDevice.httpRequestRecieved(TemperatureDevice.java:198)
10-08 10:12:25.548: WARN/System.err(10579): at org.cybergarage.http.HTTPServer.performRequestListener(HTTPServer.java:216)
10-08 10:12:25.548: WARN/System.err(10579): at org.cybergarage.http.HTTPServerThread.run(HTTPServerThread.java:54)