使用按钮performClick运行AsyncTask

时间:2015-04-20 14:37:51

标签: android android-fragments android-asynctask

我有一个包含按钮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);
            }
        });

对此有一个简单的解决方法吗?

2 个答案:

答案 0 :(得分:0)

检查调用WifiP2pManager.initialize()的方式/位置以创建WifiP2pManager.Channel对象。您提供的Looper将收到WifiP2pManager.ConnectionInfoListener实例的所有回调。如果你给它一个后台线程,那么AsyncTask将不会执行 - 它必须从主(UI)线程启动。

答案 1 :(得分:0)

对这个问题的评论非常有帮助。 AsyncTask没有被执行的原因是因为它是从当前正在执行的另一个任务调用的。因此,为了使其工作,我将AsyncTask替换为Thread类。 doInBackground()中的所有代码都放在线程的run()函数中。现在performClick()执行一个Thread,而不是一个AsyncTask,它可以工作。