-1

これを書く前に他の投稿を見ましたが、解決策が見つかりませんでした。助けていただければ幸いです。

アプリケーション ランチャーのクラスの onCreate メソッドで、スレッド TCPServer を作成し、情報を含むテーブルを表示します。問題は、この情報がさまざまであり、TCPServer が新しいメッセージ コントロールを送信したことをスレッドが検出したときに更新する必要があることです。

そして、うまく表現できたらコードを示します。

//launcher class
public class profesor extends Activity implements OnClickListener {

    static TableLayout alumnsTable; 

    @Override
    public void onCreate(Bundle savedInstanceState) {               
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        .
        .
        .

        Thread serverThread = new Thread(null, new TCPServer(), "BackgroundService");
        serverThread.start();
        .
        .
        .       

        //information is added to the table        
        alumnsTable = (TableLayout)findViewById(R.id.alumnsTable);
        List<Alumnos> listaAlumnos = Alumnos.ReadList();
        for(Alumnos al:listaAlumnos){
            alumnsTable.addView(filaAlumno(al));
        }  
    }

    //Eliminates the above information and reloads the table with the new information
    public void actualiza(){
        alumnsTable.removeAllViews();
        setContentView(R.layout.main);
        alumnsTable = (TableLayout)findViewById(R.id.alumnsTable);                          
         List<Alumnos> listaAlumnos = Alumnos.ReadList();                                                                                                   
        for(Alumnos al:listaAlumnos){
            alumnsTable.addView(filaAlumno(al));
        }
    }
}


//TCPServer class
public class TCPServer implements Runnable {
    private static Handler handler = new Handler();


    public void run() {

    ServerSocket serverSocket;

    String file;
    int filesizeMb = 4;
    int filesize = filesizeMb * (1024 * 1024); // filesize temporary hardcoded


    int bytesRead;
    int current = 0;
    try {
        serverSocket = new ServerSocket(profesor.COMUNICATION_PORT);
        Log.d(profesor.LOG_TAG,"S: Servidor Iniciado.");

        while (true) {
            final Socket sock = serverSocket.accept();
            String ClientAddr=sock.getInetAddress().toString();
            ClientAddr = ClientAddr.substring(ClientAddr.indexOf('/') + 1, ClientAddr.length());
            final String contacto=DeviceList.getDeviceName(ClientAddr);
            Log.d(profesor.LOG_TAG,"S: Conectado con: " + ClientAddr);

            // Conection type
            DataInputStream dis = new DataInputStream(sock.getInputStream());
            final String connectionType =dis.readUTF();
            Log.d(profesor.LOG_TAG,"S: Tipo de Conexion " + connectionType);

            .
            .
            .
            .

            // RECEIVING CONTROL MESSAGE
            if (connectionType.contains("CONTROL")) {
                String ControlText =dis.readUTF();
                String[] Control = ControlText.split(":");
                Log.d(profesor.LOG_TAG,"S: Recibido nuevo progreso de prueba. IP: "+Alumnos.getIdAlumno(ClientAddr)+"->"+Integer.parseInt(Control[0])+" ->"+Integer.parseInt(Control[1]));

                Alumnos.setProgress(Alumnos.getIdAlumno(ClientAddr), Integer.parseInt(Control[0]), Integer.parseInt(Control[1]));


                /****************************************************/
                //Here is where I need to call the update method of the
                //class teacher to delete the old data and fill the table
                //again.
                /****************************************************/
            }   
            dis.close();
            sock.close();
        }

        } catch (IOException e) {
            Log.d(profesor.LOG_TAG, "IOException"+e);
            e.printStackTrace();
        }
    }
}

誰かが私にいくつかのアイデアを与えることができますか?、私は例のハンドラーを見ましたが、クラス宣言ではなく、別の呼び出しです。

私の言いたいことを理解していただければ幸いです。私の英語はあまり上手ではありません。

助けてくれてありがとう

4

2 に答える 2

1

Handler または Activity 参照を使用して TCPServer を作成し、UI を更新するときにそれを使用することができます。

refHandler.post(new Runnable(){
    public void run() {
        //Update
    }
});

refActivity.runOnUiThread(new Runnable() {
    public void run() {
       //Update
    }
});
于 2012-06-22T15:33:10.237 に答える
0

runOnUiThreadスレッドから ui を更新するために使用します。

// RECEIVING CONTROL MESSAGE
            if (connectionType.contains("CONTROL")) {
                String ControlText =dis.readUTF();
                String[] Control = ControlText.split(":");
                Log.d(profesor.LOG_TAG,"S: Recibido nuevo progreso de prueba. IP: "+Alumnos.getIdAlumno(ClientAddr)+"->"+Integer.parseInt(Control[0])+" ->"+Integer.parseInt(Control[1]));

                Alumnos.setProgress(Alumnos.getIdAlumno(ClientAddr), Integer.parseInt(Control[0]), Integer.parseInt(Control[1]));


                /****************************************************/
                //Here is where I need to call the update method of the
                //class teacher to delete the old data and fill the table
                //again.
                /****************************************************/
    profesor.this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            // refresh ui here
        }
    });
        }   
于 2012-06-22T15:33:48.690 に答える