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

Рейтинг: 4Ответов: 1Опубликовано: 31.01.2015

Здравствуйте. Возникла проблема использования сокета. Вот отдельный от проекта файл 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

Ответы

▲ 4Принят

Без логов ошибки сложно сказать, но вот мои предположения:

  1. Нет разрешения в манифесте на интернет
  2. Работа с сетью идёт в основном потоке (т.е. в 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;
}
}

Теперь его надо прописать в манифесте:

<service
        android:name="ВАШ_ПАКЕТ.MyService"
        android:enabled="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/service_name" />

И наконец, теперь можно вызвать всё это из активити:

Intent intent = new Intent(this, MyService.class);
this.startService(intent);