0

J'ai un service en cours d'exécution qui reçoit des messages diffusés en LAN et j'ai démarré le service du fragment et je veux arrêter le service quand le fragment est détruit mais il donne NPE quand j'appelle stopservice. Mon service fragment appelant est:Exception de pointeur nul quand ServiceStop

public class Receive extends Fragment { 


    TextView tv1,tv2; 
    Intent intent; 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    // Inflate the layout for this fragment 

    View rootView =inflater.inflate(R.layout.receive, container, false); 

    intent = new Intent(getActivity(), Server.class); 

    tv1=(TextView)rootView.findViewById(R.id.textView1); 
    tv2=(TextView)rootView.findViewById(R.id.textView2); 
    //getActivity().startService(intent); 
    return rootView; 
} 
private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     updateUI(intent);  
    }}; 

    private void updateUI(Intent intent) { 

     Toast.makeText(getActivity().getApplicationContext(), "Yea!!! Service called", Toast.LENGTH_SHORT).show(); 
String message = intent.getStringExtra("messages"); 
String senderip = intent.getStringExtra("sender"); 

    tv2.setText(message); 

    tv1.setText(senderip); 
    } 
    @Override 
    public void onResume() { 
     super.onResume(); 
     getActivity().startService(intent); 
     getActivity().registerReceiver(broadcastReceiver, new IntentFilter(
       Server.UDP_BROADCAST)); 

     Log.i("UDP", "reg started"); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     getActivity(). unregisterReceiver(broadcastReceiver); 
     getActivity().stopService(intent); 
     Log.i("UDP", "unreg started"); 
    } 
    } 

Mon service est:

public class Server extends Service { 
static String UDP_BROADCAST = "soft.b.peopleassist"; 

//Boolean shouldListenForUDPBroadcast = false; 
DatagramSocket socket; 
//Intent intent; 
private void listenAndWaitAndThrowIntent(InetAddress broadcastIP, Integer port) throws Exception { 
    byte[] recvBuf = new byte[15000]; 
    if (socket == null || socket.isClosed()) { 
     socket = new DatagramSocket(port, broadcastIP); 
     socket.setBroadcast(true); 
    } 
    //socket.setSoTimeout(1000); 
    DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length); 
    Log.e("UDP", "Waiting for UDP broadcast"); 
    socket.receive(packet); 

    String senderIP = packet.getAddress().getHostAddress(); 
    String message = new String(packet.getData()); 

    Log.e("UDP", "Got UDB broadcast from " + senderIP + ", message: " + message); 

    broadcastIntent(senderIP, message); 
    socket.close(); 
} 

private void broadcastIntent(String senderIP, String message) { 
Intent intent = new Intent(Server.UDP_BROADCAST); 
    intent.putExtra("sender", senderIP); 
    intent.putExtra("messages", message); 
    sendBroadcast(intent); 
} 

Thread UDPBroadcastThread; 

void startListenForUDPBroadcast() { 
    UDPBroadcastThread = new Thread(new Runnable() { 
     public void run() { 
      try { 
       InetAddress broadcastIP = InetAddress.getByName("192.168.1.255"); //172.16.238.42 //192.168.1.255 
       Integer port = 11111; 
       while (shouldRestartSocketListen) { 
        listenAndWaitAndThrowIntent(broadcastIP, port); 
       } 
       //if (!shouldListenForUDPBroadcast) throw new ThreadDeath(); 
      } catch (Exception e) { 
       Log.i("UDP", "no longer listening for UDP broadcasts cause of error " + e.getMessage()); 
      } 
     } 
    }); 
    UDPBroadcastThread.start(); 
} 

private Boolean shouldRestartSocketListen=true; 

void stopListen() { 
    shouldRestartSocketListen = false; 
    socket.close(); 
} 

@Override 
public void onCreate() { 

}; 

@Override 
public void onDestroy() { 
    stopListen(); 
    //stopService(intent); 
    Log.i("UDP", "Service stoped"); 
} 


@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    shouldRestartSocketListen = true; 
    startListenForUDPBroadcast(); 
    Log.i("UDP", "Service started"); 
    return START_STICKY; 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 

} 

Mon logcat est:

09-03 09:17:21.995: D/gralloc_goldfish(908): Emulator without GPU emulation detected. 
09-03 09:17:28.763: I/UDP(908): reg started 
09-03 09:17:28.853: I/UDP(908): Service started 
    09-03 09:17:28.993: I/UDP(908): no longer listening for UDP broadcasts cause of error bind failed: EADDRNOTAVAIL (Cannot assign requested address) 
    09-03 09:17:30.653: I/UDP(908): unreg started 
09-03 09:17:30.893: D/AndroidRuntime(908): Shutting down VM 
    09-03 09:17:30.893: W/dalvikvm(908): threadid=1: thread exiting with uncaught exception (group=0x409961f8) 
    09-03 09:17:30.963: E/AndroidRuntime(908): FATAL EXCEPTION: main 
09-03 09:17:30.963: E/AndroidRuntime(908): java.lang.RuntimeException: Unable to stop service [email protected]: java.lang.NullPointerException 
    09-03 09:17:30.963: E/AndroidRuntime(908): at android.app.ActivityThread.handleStopService(ActivityThread.java:2405) 
    09-03 09:17:30.963: E/AndroidRuntime(908):  at android.app.ActivityThread.access$2000(ActivityThread.java:122) 
09-03 09:17:30.963: E/AndroidRuntime(908):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1212) 
    09-03 09:17:30.963: E/AndroidRuntime(908): at android.os.Handler.dispatchMessage(Handler.java:99) 
    09-03 09:17:30.963: E/AndroidRuntime(908): at android.os.Looper.loop(Looper.java:137) 
    09-03 09:17:30.963: E/AndroidRuntime(908): at android.app.ActivityThread.main(ActivityThread.java:4340) 
09-03 09:17:30.963: E/AndroidRuntime(908):  at java.lang.reflect.Method.invokeNative(Native Method) 
    09-03 09:17:30.963: E/AndroidRuntime(908): at java.lang.reflect.Method.invoke(Method.java:511) 
    09-03 09:17:30.963: E/AndroidRuntime(908): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
    09-03 09:17:30.963: E/AndroidRuntime(908): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
09-03 09:17:30.963: E/AndroidRuntime(908):  at dalvik.system.NativeStart.main(Native Method) 
    09-03 09:17:30.963: E/AndroidRuntime(908): Caused by: java.lang.NullPointerException 
    09-03 09:17:30.963: E/AndroidRuntime(908): at soft.b.peopleassist.Server.stopListen(Server.java:68) 
    09-03 09:17:30.963: E/AndroidRuntime(908): at soft.b.peopleassist.Server.onDestroy(Server.java:78) 
    09-03 09:17:30.963: E/AndroidRuntime(908): at android.app.ActivityThread.handleStopService(ActivityThread.java:2388) 
    09-03 09:17:30.963: E/AndroidRuntime(908): ... 10 more 
    09-03 09:17:33.533: I/Process(908): Sending signal. PID: 908 SIG: 9 

Merci à l'avance.

+2

Veuillez attacher la pile pour votre NPE à votre question et marquer les lignes mentionnées dans votre code source. – zapl

+0

@zapl vérifier question éditée :) – Nerd

+0

socket.close(); @zapl – Nerd

Répondre

0

Dans la méthode stopListen(), vous définissez le paramètre booléen stop, puis fermez immédiatement le socket. Il est possible que votre autre thread travaille en profondeur avec cela. Je suggère, que vous fermez les douilles dans le fil dans lequel ils ont été créés. par exemple. socket.close() dans le bloc catch et le retirer de stopListen().