2

問題があります。Dialog.dismiss()動作しません。WinServer 2003にログインするために、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) {

        }
    }
};
4

2 に答える 2

0

スレッドを開始するには、コードを変更する必要があります。メソッドを呼び出す必要があります。これにより、そのスレッドで記述され start()たメソッドが実行されます。したがって、ハンドラー内ではなく呼び出します。run()
Connect.start()Connect.run()onClick

于 2012-06-20T02:11:01.407 に答える
0

UIスレッドでアラートダイアログを閉じる必要があると思います。そうしないと機能しません。これは 2 つの方法で行うことができます。 1. メッセージ ハンドラを使用します。 2. RunOnUiThread を使用します。あなたの参照のためのサンプル:

1.

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

2.

Runnable hide_ui = new Runnable() {
   @Override
   public void run() {
     // do here                           
   }
 };
 runOnUiThread(hide_ui);
于 2012-06-20T09:59:30.540 に答える