Страницы

Поиск по вопросам

среда, 27 февраля 2019 г.

Создание Android приложений. Sockets

Здравствуйте. Возникла проблема использования сокета. Вот отдельный от проекта файл Client.java, который служит для проверки соединения в консольном режиме:
import java.net.Socket; import java.net.UnknownHostException; import java.io.*;
public class Client { static AffableThread mSecondThread; public static void main(String[] args) { mSecondThread = new AffableThread(); mSecondThread.start(); } } class AffableThread extends Thread { @Override public void run() { System.out.println("Абракадабра"); try{ Socket socket = new Socket("127.0.0.1", 5555); }catch(UnknownHostException e){}catch(IOException e){} System.out.println("Подключайся любезнейший!"); } }
Работает на ура, подключается к серверу без проблем. Но стоит мне распихать элементы этого кода по моему основному коду, то выдает ошибкy:
> FATAL EXCEPTION: main > java.lang.NullPointerException


Ответ

Без логов ошибки сложно сказать, но вот мои предположения: Нет разрешения в манифесте на интернет Работа с сетью идёт в основном потоке (т.е. в onCreate() активити или фрагмента). Так с определённой версии андроида низзя. Надо делать в отдельном потоке. Например в Service или AsynkTask. Если всё же использовать Service, то надо про него почитать доки И делать как-то так: Создаём класс, расширяющий класс android.app.Service public class MyService extends Service { @Override public void onCreate() {
}
@Override public int onStartCommand(Intent intent, int flags, int startId) { //вот тут можно работать с сетью без проблем. return super.onStartCommand(intent, flags, startId); }
@Override public void onDestroy() { }
@Override public IBinder onBind(Intent intent) { return null; } } Теперь его надо прописать в манифесте: И наконец, теперь можно вызвать всё это из активити: Intent intent = new Intent(this, MyService.class); this.startService(intent);

Комментариев нет:

Отправить комментарий