1

我试图连接到我的XAMPP服务器并与下面的类与MySQL数据库进行交互。但是,错误提示我在行上收到NullPointerException:NullPointerError:无法连接到服务器

result = imService.createNewGroup(newGroupName); 

在CreateGroup类中。应该注意的是,CreateGroup类也在用户将文本输入到对话框并且从那里开始服务之后立即调用。我对服务和网络连接相当陌生,但是在我尝试发送.createGroup命令之前,我是否应该允许至少验证服务已连接?

CreateGroup类:为 “createGroup” 方法

public class CreateGroup extends Activity { 

    private static final String SERVER_RES_RES_SIGN_UP_SUCCESFULL = "1"; 
    private static final String SERVER_RES_SIGN_UP_USERNAME_CRASHED = "2"; 

    private Manager imService; 
    private Handler handler = new Handler(); 
    String newGroupName; 

    public ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceConnected(ComponentName className, IBinder service) { 
      imService = ((MessagingService.IMBinder) service).getService(); 

     } 

     public void onServiceDisconnected(ComponentName className) { 

      imService = null; 
      Toast.makeText(CreateGroup.this, R.string.local_service_stopped, 
        Toast.LENGTH_SHORT).show(); 
     } 
    }; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     bindService(new Intent(CreateGroup.this, MessagingService.class), 
       mConnection, Context.BIND_AUTO_CREATE); 

     // Getting intent and info from the dialog 
     Intent i = getIntent(); 
     Bundle extras = i.getExtras(); 

     newGroupName = extras.getString("groupName"); 

     Thread thread = new Thread() { 
      String result = new String(); 

      @Override 
      public void run() { 

       // Send group name to the messaging 
       // service 
       try { 
        result = imService.createNewGroup(newGroupName); 

       } catch (NullPointerException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (UnsupportedEncodingException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       Log.d("problem", "The value of result is " + result.toString()); 

       handler.post(new Runnable() { 

        @Override 
        public void run() { 

         if (result == null) { 
          Toast.makeText(getApplicationContext(), 
            "It's null, not working", Toast.LENGTH_LONG) 
            .show(); 
         } 

         if (result != null 
           && result 
             .equals(SERVER_RES_RES_SIGN_UP_SUCCESFULL)) { 
          Toast.makeText(getApplicationContext(), 
            R.string.signup_successfull, 
            Toast.LENGTH_LONG).show(); 
          // showDialog(SIGN_UP_SUCCESSFULL); 
         } else if (result != null 
           && result 
             .equals(SERVER_RES_SIGN_UP_USERNAME_CRASHED)) { 
          Toast.makeText(getApplicationContext(), 
            R.string.signup_username_crashed, 
            Toast.LENGTH_LONG).show(); 
          // showDialog(SIGN_UP_USERNAME_CRASHED); 
         } else // if 
           // (result.equals(SERVER_RES_SIGN_UP_FAILED)) 
         { 
          Toast.makeText(getApplicationContext(), 
            R.string.signup_failed, Toast.LENGTH_LONG) 
            .show(); 
          // showDialog(SIGN_UP_FAILED); 
         } 

        } 

       }); 

      } 
     }; 
     thread.start(); 
    } 

服务器机箱:

case "createGroup": 

     $SQLtest = "insert into groups(groupName, uniqueGroup, createTime) 
      VALUES('TestGroup', 1234567891, NOW())"; 

      error_log("$SQLtest", 3 , "error_log"); 

     if($result = $db -> query($SQLtest)) 
     { 
      $out = SUCCESSFUL; 
     } 
     else 
     { 
      $out = FAILED; 
     } 

    break; 

消息服务和createGroup方:

public class MessagingService extends Service implements Manager, Updater { 
    // private NotificationManager mNM; 

    public static String USERNAME; 
    public static final String TAKE_MESSAGE = "Take_Message"; 
    public static final String FRIEND_LIST_UPDATED = "Take Friend List"; 
    public static final String MESSAGE_LIST_UPDATED = "Take Message List"; 
    public ConnectivityManager conManager = null; 
    private final int UPDATE_TIME_PERIOD = 15000; 

    private String rawFriendList = new String(); 
    private String rawMessageList = new String(); 

    SocketerInterface socketOperator = new Socketer(this); 

    private final IBinder mBinder = new IMBinder(); 
    private String username; 
    private String password; 
    private boolean authenticatedUser = false; 
    // timer to take the updated data from server 
    private Timer timer; 

    private StorageManipulater localstoragehandler; 

    private NotificationManager mNM; 

    public class IMBinder extends Binder { 
     public Manager getService() { 
      return MessagingService.this; 
     } 

    } 

    @Override 
    public void onCreate() { 
     mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

     localstoragehandler = new StorageManipulater(this); 
     // Display a notification about us starting. We put an icon in the 
     // status bar. 
     // showNotification(); 
     conManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
     new StorageManipulater(this); 

     // Timer is used to take the friendList info every UPDATE_TIME_PERIOD; 
     timer = new Timer(); 

     Thread thread = new Thread() { 
      @Override 
      public void run() { 

       Random random = new Random(); 
       int tryCount = 0; 
       while (socketOperator.startListening(10000 + random 
         .nextInt(20000)) == 0) { 
        tryCount++; 
        if (tryCount > 10) { 
         // if it can't listen a port after trying 10 times, give 
         // up... 
         break; 
        } 

       } 
      } 
     }; 
     thread.start(); 

    } 



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


    @Override 
     public String createNewGroup(String groupName) throws NullPointerException, UnsupportedEncodingException { 
      String params = "action=createGroup"; 

      String result = socketOperator.sendHttpRequest(params); 

      return result; 
     } 
} 

回答

11

因为你的代码中有一个固有的竞争条件。还有一个邪恶的。

更改为这样的事情:从

public ServiceConnection mConnection = new ServiceConnection() { 

     volatile boolean isConnected; 
     public void onServiceConnected(ComponentName className, IBinder service) { 

      isConnected = true; // <--------------------- 

      imService = ((MessagingService.IMBinder) service).getService(); 

      startCommunicationThread(); 
     } 


     public void onServiceDisconnected(ComponentName className) { 

      isConnected = false; // <--------------- 

      imService = null; 
      Toast.makeText(CreateGroup.this, R.string.local_service_stopped, 
        Toast.LENGTH_SHORT).show(); 
     } 
    }; 

和poll isConnected:

public void onCreate(Bundle savedInstanceState) { 
     bindService(new Intent(CreateGroup.this, MessagingService.class), 
        mConnection, Context.BIND_AUTO_CREATE); 

     // but do not start thread here! 
} 


public ServiceConnection mConnection = new ServiceConnection() { 

     public void onServiceConnected(ComponentName className, IBinder service) { 
      imService = ((MessagingService.IMBinder) service).getService(); 

      startCommunicationThread(); // <----------------------- only here can you start comm. thread 

     } 

     public void onServiceDisconnected(ComponentName className) { 

      imService = null; 
      Toast.makeText(CreateGroup.this, R.string.local_service_stopped, 
        Toast.LENGTH_SHORT).show(); 
     } 
    }; 


void startCommunicationThread() { 
    Thread thread = new Thread() { 
    String result = new String(); 

    @Override 
    public void run() { 
     try { 
      result = imService.createNewGroup(newGroupName); 
      .......... 

} 


如果你想你的代码更加安全,使用连接状态栏在startCommunicationThread中确保没有突然断开。

+0

谢谢,这工作正好 – Sauron

0

在我的项目中MessagingService.IMBinder MessagingService给出错误是否有我应该导入的任何java类。