1

我正在尝试连接到我的 XAMPP 服务器并使用以下类与 MySQL 数据库进行交互。但是,错误指出我在该行收到 NullPointerException:

result = imService.createNewGroup(newGroupName);

在 CreateGroup 类中。需要注意的是,在用户将文本输入 Dialog 并从那里启动服务之后,也会立即调用 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();
    }

“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;
        }
}
4

2 回答 2

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

并从 startCommunicationThread 中轮询 isConnected 以确保不会突然断开连接。

于 2014-07-05T20:02:44.100 回答
0

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

于 2015-05-23T13:21:33.247 回答