Runnable is a Java interface that defines one method: "run". You can think of it as a method packaged as an object.

Define a class that implements Runnable, and pass it to m_view.update() or runOnUIThread().

Once you've done that, the runnable object's run() method will be called (asynchronously) on the UI thread. This method can then call methods in m_view to display the message etc.

You might also want to look at AsyncTask:

http://developer.android.com/reference/android/os/AsyncTask.html

>>
AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.
<<

-- Kostya

17.10.2010 0:12, chcat пишет:
Ok, that helps, but what is Runnable action and how is it related to
thread?

On Oct 16, 3:00 pm, Kostya Vasilyev<[email protected]>  wrote:
   You can only access UI objects from the main (UI) thread.

There are several ways to "post" UI operations to the UI thread.

This one is probably the easiest: Activity.runOnUIThread(Runnable action)

http://developer.android.com/reference/android/app/Activity.html#runO...)

-- Kostya

16.10.2010 20:58, chcat пишет:



I have an Activity with TextView that I am trying to update from
different thread. To do that i pass TextView to the "updater" thread
onCreate(..)
..
txtStatus = (TextView)this.findViewById(R.id.status);
// start udp server as separate thread and pass TextView to that
thread to print text messages from udp socket
new Thread(new TelemetryServer(txtStatus)).start();
//see thread code below
As a result i have thread error, even though "updater" is
synchronized:
ERROR/UDP(282): android.view.ViewRoot$CalledFromWrongThreadException:
Only the original thread that created a view hierarchy can touch its
views.
Any other ideas how to solve this problem?
Tnank you,
-V
public class TelemetryServer implements Runnable {
    public static final String SERVERIP = "127.0.0.1"; // 'Within' the
emulator!
    public static final int SERVERPORT = 2222;
    private TextView m_view;
    private DatagramSocket socket;
    private boolean loop;
    private synchronized void update( String msg)
    {
            m_view.append("\n");
            m_view.append(msg);
    }
    public TelemetryServer(TextView _view)
    {
            m_view = _view;
            loop = true;
    }
    public void run() {
            try {
                            InetAddress serverAddr = 
InetAddress.getByName(SERVERIP);
                            Log.d("UDP", "S: Connecting...");
                            socket = new DatagramSocket(SERVERPORT,
                                            serverAddr);
                            Log.i("TelemetryServer", "started");
                            while(loop) {
                                    byte[] buf = new byte[1024];
                                    DatagramPacket packet = new 
DatagramPacket(buf, buf.length);
                                    socket.receive(packet);
                                    update(new String(packet.getData()));
                            }
                    } catch (Exception e) {
                            Log.e("UDP", "S: Error", e);
                    } // end of try
                    Log.d("UDP", "S: Done.");
                    socket.close();
    }
}
--
Kostya Vasilyev -- WiFi Manager + pretty widget --http://kmansoft.wordpress.com


--
Kostya Vasilyev -- WiFi Manager + pretty widget -- http://kmansoft.wordpress.com

--
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to