开发者

problem in synchronizing threads while using AsyncTask, Android

开发者 https://www.devze.com 2023-02-20 02:34 出处:网络
I am making and application to send data using sockets from an android device to a server and in reverse.

I am making and application to send data using sockets from an android device to a server and in reverse. I am using an AsyncTask class to handle the connection. My problem is that at some point in my main Activity class i have to read from the input stream eg.

    conhandler = new ConnectionHandler();
    conhandler.execute();
    Log.i("AppOne", "Reading from stream");
    message = conhandler.readFromStream();

and what happens is that this code snippet is executed before my ConnectionHandler class has established a socket connection. Any ways to fix this issue? Here is the code to my ConnectionHandler class:

public class ConnectionHandler extends AsyncTask<Void, Void, Void>{

public static String serverip = "192.168.1.100";
public static int serverport = 7777;
Socket s;
public DataInputStream dis = null;
public DataOutputStream dos = null;
public int message;



@Override
protected Void doInBackground(Void... params) {

    try {
        Log.i("AsyncTank", "doInBackgoung: Creating Socket");
        s = new Socket("192.168.1.100", 7777);
    } catch (Exception e) {
        Log.i("AsyncTank", "doInBackgoung: Cannot create Socket");
    }
    Log.i("AsyncTank", "doInBackgoung: Socket created");
    if (s.isConnected()) {
        try {
            Log.i("AsyncTank", "doInBackgoung: inside input try");
            dis = new DataInputStream(s.getInputStream());
            Log.i("AsyncTank", "doInBackgoung: InputStream assigned");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket not connected");
            e.printStackTrace();
        }
        try {
            Log.i("AsyncTank", "doInBackgoung: inside output try");
            dos = new DataOutputStream(s.getOutputStream());
            Log.i("AsyncTank", "doInBackgoung: OutputStream assigned");
        } catch (IOException e) {
            // TODO Auto-generated catch block
            Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket not connected");
            e.printStackTrace();
        }
    } else {
        Log.i("AsyncTank", "doInBackgoung: Cannot assign Streams, Socket is closed");
    }

    return null;
}

public void writeToStream(double lat, double lon) {
    try {
            Log.i("AsynkTask", "writeToStream : Writing lat");
            dos.writeDouble(lat);
            dos.flush();
        } catch (Exception e) {
        Log.i("AsynkTask", "writeToStream : Writing failed");
    }
    try {
            Log.i("AsynkTask", "writeToStream : Writing lon");
            dos.writeDouble(lon);
            dos.flush();
        } catch (Exception e) {
        Log.i("AsynkTask", "writeToStream : Writing failed");
    }
}

public int readFromStream() 开发者_StackOverflow社区{
    try {
        if (s.isConnected()) {
            Log.i("AsynkTask", "readFromStream : Reading message");
            message = dis.readInt();
        } else {
            Log.i("AsynkTask", "readFromStream : Cannot Read, Socket is closed");
        }
    } catch (Exception e) {
        Log.i("AsynkTask", "readFromStream : Reading failed");
    }
    return message;
}

}


Yep, you need to do all the network operations in the ASyncTask thread. You can also do things when the task finishes, by overriding the onPostExecute() method. Stuff in there runs on the UI thread, so you can manipulate textviews, layouts etc.

Example of how you could use an asynctask to open a socket and write a double to it:

public class ASyncExample extends Activity {

    private TextView mTextView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // set stuff up
        super.onCreate(savedInstanceState);
    }

    private class WriteToServer extends AsyncTask<Double, Void, Void> {

        private final String serverip = "192.168.1.100";
        private final int serverport = 7777;
        Socket s;
        private DataOutputStream dos = null;

        @Override
        protected Void doInBackground(Double... params) {

            try {

                // open the stream
                s = new Socket("192.168.1.100", 7777);
                dos = new DataOutputStream(s.getOutputStream());

                // write the passed double to the stream
                dos.writeDouble(params[0]);
                dos.flush();

            } catch (Exception e) {
                Log.i("AsyncTank", "something's gone wrong");
            }

            return null;
        }
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消