Socket Client AsyncTask

Ответить
Дмитрий_
Сообщения: 9
Зарегистрирован: 17 сен 2013, 19:46

Socket Client AsyncTask

Сообщение Дмитрий_ » 28 апр 2014, 23:10

Здравствуйте!
Нашёл пример http://stackoverflow.com/questions/5135 ... -asynctask
Socket Client, но не могу понять почему не завершается поток не выходит из цикла While в doInBackground....

Код: Выделить всё

public class NetworkTask extends AsyncTask<Void, String, Boolean> {
		// Network Socket
		public InputStream is; // Network Input Stream
		public OutputStream os; // Network Output Stream

		String ip, prt;

		public NetworkTask(String ip, String prt) {
			// TODO Auto-generated constructor stub
			this.ip = ip;
			this.prt = prt;

		}

		@Override
		protected void onPreExecute() {
			Log.i("AsyncTask", "onPreExecute");

		}

		@Override
		protected Boolean doInBackground(Void... params) { // This runs on a
															// different thread
			boolean result = false;
			try {
				Log.i("AsyncTask", "doInBackground: Creating socket");
				SocketAddress sockaddr = new InetSocketAddress(ip,
						Integer.parseInt(prt)); // 192.168.2.102 118.139.161.101
				nsocket = new Socket();
				nsocket.connect(sockaddr, 10000); // 10 second connection
													// timeout

				if (nsocket.isConnected()) {
					Log.i("AsyncTask",
							"doInBackground: nsocket.isConnected=true");

					is = nsocket.getInputStream();
					os = nsocket.getOutputStream();
					Log.i("AsyncTask",
							"doInBackground: Socket created, streams assigned");
					Log.i("AsyncTask",
							"doInBackground: Waiting for inital data...");

					Connected = true;

					int c = 0;

					while (Connected) {

						StringBuffer sbl = new StringBuffer();

						while (((c = is.read()) != '\n') && (c != -1) && Connected) {

							if ((char) c == '~') {
								break;
							}

							sbl.append(((byte) c));

						}

						String my = new String(sbl.toString());

						publishProgress(my);

					} // while (Connected)

				} // if (nsocket.isConnected())

				try {
					is.close();
					os.close();
					nsocket.close();

				} catch (IOException e) {
					e.printStackTrace();
				}

			} catch (IOException e) {

				Log.e("AsyncTask", "doInBackground: IOException=");
				e.printStackTrace();
				result = true;
				Connected = false;

			} catch (Exception e) {
				e.printStackTrace();
				Log.e("AsyncTask",
						"doInBackground: Exception=" + e.getMessage());
				result = true;
				Connected = false;
			}

			Log.i("AsyncTask", "doInBackground: Finished");
			log("doInBackground: Finished");
			Connected = false;

			return result;
		}
@Override
		protected void onProgressUpdate(String... values) {
			super.onProgressUpdate(values);

				Log.i("AsyncTask", "onProgressUpdate: " + values.length
						+ " bytes received.");

			
		}
@Override
		protected void onCancelled() {
			super.onCancelled();

			Connected = false;

			Log.i("AsyncTask", "Cancelled.");

			disconnect.setVisibility(View.GONE);
			btnStart.setVisibility(View.VISIBLE);

		}

		@Override
		protected void onPostExecute(Boolean result) {
			if (result) {
				Log.i("AsyncTask", "onPostExecute: Completed with an Error="
						+ err);
			} else {
				Log.i("AsyncTask", "onPostExecute: Completed. Cсоединение закрыто!"");
			}

			Connected = false;

		}
	}
Из потока UI переменную Connected = false, но AsyncTask всё ровно не завершается, networktask.cancel(true) - тоже не завершает поток. Если переменная Connected = false, и со стороны сервера послать этому клиенту данные тогда поток останавливается.
В этом примере вроде есть решение ноя не могу разобраться как это реализовать.
Может у кого есть более интересные и правильные решения Socket Client?
Заранее благодарен за ответ.

Donart
Сообщения: 114
Зарегистрирован: 06 ноя 2013, 08:59

Re: Socket Client AsyncTask

Сообщение Donart » 29 апр 2014, 11:24

У Вас же переменная Сonnected = true, как цикл завершится. Где Вы ее меняете?
Из потока UI переменную Connected = false
Как? Вижу в onCancelled() Connected = false, но он вызывается уже после doInBackground вместо onPostExecute. Если используете cancel(true) делайте проверку if(isCancelled()) break;
Незнаю Ваших задач и зачем столько преобразований типов, но можете попробывать реализовать так[syntax=java]
BufferedReader br = new BufferedReader(new InputStreamReader(is));
StringBuffer sbl = new StringBuffer();
String line = "";
while( (line=br.readLine()) != null){
sbl.append(line);
}[/syntax]

Ответить