我有一个包含按钮btn_connect
的片段,当按下它时,会在两个设备之间建立WiFi直连连接。该片段实现了ConnectionInfoListener。所以它有onConnectionInfoAvailable
函数,我想执行AsyncTask类。我遇到的问题是,在一个Activity中,我正在做:
fragment.mContentView.findViewById(R.id.btn_connect).performClick();
单击该按钮并建立连接,因此代码进入onConnectionInfoAvailable函数,但AsyncTask未执行。
@Override
public void onConnectionInfoAvailable(final WifiP2pInfo info) {
//..code..
Log.d("Test 1", "Test 1");
new MasterServerTask().execute();
}
public class MasterServerTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... arg0) {
//**************
Log.d("IM INSIDE ASYNCTASK CLASS", "SOCKET");
try {
serverSocket = new ServerSocket(8090);
} catch (IOException e) {
e.printStackTrace();
}
while (true) {//wait for clients
Socket socket = null;
try {
socket = serverSocket.accept();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.d("ACCEPTED A SLAVE DEVICE "+num_clients, "ACCEPTED A SLAVE DEVICE "+num_clients);
num_clients++;
OutputStream os=null;
try {
os = socket.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
proxy.addSlaveOutputStream(os);
}
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
}
}
mContentView.findViewById(R.id.btn_connect).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {//Phone that connects first is NOT the group owner
// port = Integer.parseInt(editTextPort.getText().toString());
Log.d("IM IN THE OTHER FRAGMENT", "Connect");
WifiP2pConfig config = new WifiP2pConfig();
config.groupOwnerIntent = 0;
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
}
progressDialog = ProgressDialog.show(getActivity(), "Press back to cancel",
"Connecting to :" + device.deviceAddress, true, true
);
((DeviceActionListener) getActivity()).connect(config);
}
});
对此有一个简单的解决方法吗?
答案 0 :(得分:0)
检查调用WifiP2pManager.initialize()
的方式/位置以创建WifiP2pManager.Channel
对象。您提供的Looper
将收到WifiP2pManager.ConnectionInfoListener
实例的所有回调。如果你给它一个后台线程,那么AsyncTask
将不会执行 - 它必须从主(UI)线程启动。
答案 1 :(得分:0)
对这个问题的评论非常有帮助。 AsyncTask没有被执行的原因是因为它是从当前正在执行的另一个任务调用的。因此,为了使其工作,我将AsyncTask
替换为Thread
类。 doInBackground()
中的所有代码都放在线程的run()
函数中。现在performClick()执行一个Thread,而不是一个AsyncTask,它可以工作。