Android 安卓可以';运行套接字时,无法关闭对话框

Android 安卓可以';运行套接字时,无法关闭对话框,android,sockets,rdp,Android,Sockets,Rdp,我有一些问题。不起作用。 我想输入ip,用户名,密码登录。当我点击提交按钮时,对话框无法关闭。需要注意的是,我的线程套接字能够从服务器检索消息并将消息发送回服务器。只有当线程套接字出错时,才能关闭该对话框 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.jiemian); netInit

我有一些问题。不起作用。 我想输入ip,用户名,密码登录。当我点击提交按钮时,对话框无法关闭。需要注意的是,我的线程套接字能够从服务器检索消息并将消息发送回服务器。只有当线程套接字出错时,才能关闭该对话框

 public void onCreate(Bundle savedInstanceState) {      
    super.onCreate(savedInstanceState);
    setContentView(R.layout.jiemian);

    netInit();
    JieMianActivity.jiemian = this;
    LayoutInflater factory = LayoutInflater.from(JieMianActivity.this);  

    View view = factory.inflate(R.layout.login, null);  

    dialog02 = new AlertDialog.Builder(JieMianActivity.this)  
         .setIcon(android.R.drawable.btn_star)  
         .setTitle("login")  
           .setView(view)  
           .setPositiveButton("submit", onclickButton)  
           .setNegativeButton("cancel",  onclickButton).create();  
    dialog02.show(); 
}

private OnClickListener onclickButton = new OnClickListener() {

    @Override  
    public void onClick(DialogInterface dialog, int which) {  
        Log.v("which", which+"");
        switch(which){
        case Dialog.BUTTON_POSITIVE:
            dialog.dismiss();//doesn't work , cann't close dialog.
            EditText ip = (EditText) findViewById(R.id.ip);

            EditText username = (EditText) findViewById(R.id.username);

            EditText password = (EditText) findViewById(R.id.password);

            new Connect(JieMianActivity.jiemian).run();//do some socket thing
            break;
        case Dialog.BUTTON_NEGATIVE:
            dialog.dismiss();
            JieMianActivity.jiemian.finish();
            break;
        }
    }
};
这是我的帖子:

 class Connect extends Thread{
    private JieMianActivity jiemain;
    public Connect(JieMianActivity jiemian){
        this.jiemain = jiemian;
    }

    public void run(){
        //Process.setThreadPriority(Process.THREAD_PRIORITY_LOWEST);
        try {
            Display display = getWindowManager().getDefaultDisplay();
            InputStream is = getResources().getAssets().open(
                    connect2RDP.mapFile);

            sfv = (SurfaceView) findViewById(R.id.surfaceView);

            sfh = sfv.getHolder();
            sfh.addCallback(JieMianActivity.jiemian);

            if (conn.connect("192.168.10.134", "Adminstrator", "123",
                    display.getWidth(), display.getHeight(), 3389, is)) {
                Log.v("login", "success");  

                //dialog02.dismiss();
                Log.v("login", "ok");

                canvas = new MyCanvas();
                canvas.setRop(new RasterOp());
                canvas.setHeight(Options.height);
                canvas.setWidth(Options.width);
                canvas.setRight(Options.width - 1);
                canvas.setBottom(Options.height - 1);
                canvas.setBackstore(new WrappedImage(Options.width,
                        Options.height, JieMianActivity.jiemian));
                canvas.setJiemian(JieMianActivity.jiemian);
                canvas.setSurView(sfv);
                canvas.setSurHolder(sfh);
                conn.doconnect(JieMianActivity.jiemian);// 启动RDP

                // init();
            }
        } catch (OrderException e) {

        } catch (Exception e) {

        }
    }
};

您需要更改代码以启动线程,您需要调用方法
start()
——该方法将执行在该线程中编写的
run()
方法。
所以,
onClick
处理程序中调用
Connect.start()
而不是
Connect.run()

您需要更改代码以启动线程,您需要调用将执行该线程中编写的
run()
方法的方法
start()

所以,
onClick
处理程序中调用
Connect.start()
而不是
Connect.run()

我认为您应该关闭UI线程中的警报对话框,否则它将无法工作。你可以通过两种方式做到这一点:1。使用消息处理程序2。使用RunOnUiThread。样本供您参考:

一,

二,


我认为你应该在UI线程中关闭你的警报对话框,否则它将无法工作。你可以通过两种方式做到这一点:1。使用消息处理程序2。使用RunOnUiThread。样本供您参考:

一,

二,

messageHandler.sendEmptyMessageDelayed(unique_id, 500);

private Handler messageHandler = new Handler()
{
    @Override
    public void handleMessage(Message msg) {
        switch(msg.what) {

            case unique_id:
                // do here
                break;
        }
    }
};
Runnable hide_ui = new Runnable() {
   @Override
   public void run() {
     // do here                           
   }
 };
 runOnUiThread(hide_ui);