0

次のコードには、特定のソケットを使用してサーバーへの接続を担当するスレッドがあります。接続のアイデアはうまく機能します(別のスレッドで)。接続が確立された後、ハンドラーを使用してメインのアクティビティを更新しようとしましたが、更新されませんでした!

バックグラウンドスレッドのコードは次のとおりです。

public class SocketThread extends Thread {

private final Socket socket;
private final InputStream inputStream;
private final OutputStream outputStream;
byte[] buffer = new byte[32];
int bytes;


public SocketThread(Socket sock) {
    socket = sock;
    InputStream tmpIn = null;
    OutputStream tmpOut = null;
    try {
        tmpIn = socket.getInputStream();
        tmpOut = socket.getOutputStream();
    }
    catch (IOException e) {}
    inputStream = tmpIn;
    outputStream = tmpOut;
    EntryActivity.connected = true;
    buffer = "connect".getBytes();
    EntryActivity.UIupdater.obtainMessage(0, buffer.length, -1, buffer).sendToTarget();

}


public void run() {
    try {
        while (!Thread.currentThread().isInterrupted()) {
            bytes = inputStream.read(buffer);
            EntryActivity.UIupdater.obtainMessage(0, bytes, -1, buffer).sendToTarget();
        }
    } catch (IOException e) {
    }
}
}

そして、ここにハンドラーがあります:

static Handler UIupdater = new Handler() {
    public void handleMessage(Message msg) {
        int numOfBytes = msg.arg1;
        byte[] buffer = (byte[]) msg.obj;
        strRecieved = new String(buffer);
        strRecieved = strRecieved.substring(0, numOfBytes);
        if (strRecieved.equals("connect"))
                        // Update a TextView
            status.setText(R.string.connected);
        else 
                        // Do something else;
    }
};

サーバー コードを使用して接続が確立されたことを確認しましたが、TextView は変更されていません。

4

2 に答える 2

0

以下のサンプルコードを使用してみてください。お役に立てば幸いです。

byte[] buffer = new byte[32];
static int REFRESH_VIEW = 0;

public void onCreate(Bundle saveInstance)
{
    RefreshHandler mRefreshHandler = new RefreshHandler();

    final Message msg = new Message();
    msg.what = REFRESH_VIEW; // case 0 is calling
    final Bundle bData = new Bundle();
    buffer = "connect".getBytes();
    bData.putByteArray("bytekey", buffer);
    msg.setData(bData);
    mRefreshHandler.handleMessage(msg); // Handle the msg with key and value pair.
}

/**
 * RefreshHandler is handler to refresh the view.
 */
static class RefreshHandler extends Handler
{
    @Override
    public void handleMessage(final Message msg)
    {
        switch(msg.what)
        {
        case REFRESH_VIEW:
            final Bundle pos = msg.getData();
            final byte[] buffer = pos.getByteArray("bytekey");
            String strRecieved = new String(buffer);
            //Update the UI Part.
            status.setText("Set whatever you want. " + strRecieved);
            break;
        default:
            break;
        }
    }
};
于 2013-07-20T05:09:20.930 に答える