gpt4 book ai didi

android - 空指针错误 : Cannot Connect to Server

转载 作者:行者123 更新时间:2023-11-29 14:22:56 25 4
gpt4 key购买 nike

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

result = imService.createNewGroup(newGroupName);

在 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;

消息服务和 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;
}
}

最佳答案

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

改成这样:

 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 isConnected 以确保不会突然断开连接。

关于android - 空指针错误 : Cannot Connect to Server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24590008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com