1

Я пытаюсь подключиться к моему серверу XAMPP и взаимодействовать с базой данных MySQL с приведенными ниже классами. Однако ошибка отмечает, что я получаю NullPointerException на линии:NullPointerError: не удается подключиться к серверу

result = imService.createNewGroup(newGroupName); 

В классе CreateGroup. Следует отметить, что класс CreateGroup также вызывается сразу после того, как пользователь вводит текст в диалог, и служба запускается оттуда. Я довольно новичок в сервисах и сетевых подключениях, но есть ли что-то, что мне не хватает, что должно позволить хотя бы проверить, что служба подключена, прежде чем пытаться отправить команду .createGroup?

CreateGroup Класс: Case

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(); 
    } 

Сервер для "createGroup" метод:

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 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); 
      .......... 

} 


Если вы хотите, чтобы ваш код будет еще более безопасным, используйте состояние соединения поле:

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(); 
     } 
    }; 

И опрашивать IsConnected из в startCommunicationThread, чтобы не было внезапных отключений.

+0

Спасибо, что сработало правильно – Sauron

0

в моем проекте MessagingService.IMBinder MessagingService дает ошибку, есть ли какой-либо класс java, который я должен импортировать.

Смежные вопросы