Sau*_*ron 1 xampp service android nullpointerexception serviceconnection
我正在尝试连接到我的XAMPP服务器并使用以下类与MySQL数据库进行交互.但是,错误指出我在该行收到NullPointerException:
result = imService.createNewGroup(newGroupName);
在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();
    }
"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;
Messaging Service和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;
        }
}
Gil*_*mov 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中连接poll以确保不会突然断开连接.
| 归档时间: | 
 | 
| 查看次数: | 218 次 | 
| 最近记录: |