1

ユーザーが自分の情報を挿入し、ボタンをクリックして、この情報をデータベースに保存した Web サービスに送信するサインアップ アクティビティを実装したいと考えています。

Web サービスに接続するためのコードを別のスレッド (UI スレッドではありません) に配置し、progressdialogWeb サービスへの接続が完了するまでを表示したい場合は、次のAlertDialogような別のメッセージを表示するために を表示したい (このメールは使用されます)別のものを試すか、サインアップが成功しました!)

ユーザーがサインアップボタンをクリックしたときの言い訳は次のとおりです。

public void SignupNewUser (View V)
{
    Working = ProgressDialog.show(this, "Working..", "Connecting To Server");       
    Runnable work = new Runnable() {
        @Override
        public void run() {
            Edit_Text_FName = (EditText) findViewById(R.id.Edit_Text_Fname_Signup);
            Edit_Text_LName = (EditText) findViewById(R.id.Edit_Text_Lname_Signup);
            Edit_Text_Password = (EditText) findViewById(R.id.Edit_Text_Password_Signup);
            Edit_Text_Email = (EditText) findViewById(R.id.Edit_Text_Email_Signup);
            S1 = (Spinner) findViewById(R.id.Spinner_Signup);
            SignupPerson SUPerson = new SignupPerson();
            SUPerson.F_Name = Edit_Text_FName.getText().toString().trim();
            SUPerson.L_Name = Edit_Text_LName.getText().toString().trim();
            SUPerson.E_Mail = Edit_Text_Email.getText().toString().trim();
            SUPerson.PassW  = Edit_Text_Password.getText().toString().trim();
            SUPerson.Gen = Choosen_Gender;
            SUPerson.Cou_Id = S1.getSelectedItemPosition();
            METHOD = "signup";
            SoapObject Request = new SoapObject(NAMESPACE, METHOD);
            PropertyInfo P = new PropertyInfo();
            P.setName("SUPerson");
            P.setValue(SUPerson);
            P.setType(SUPerson.getClass());
            Request.addProperty(P);
            SoapSerializationEnvelope envolope = new SoapSerializationEnvelope(SoapSerializationEnvelope.VER11);
            envolope.dotNet = true;
            envolope.setOutputSoapObject(Request);
            envolope.addMapping(NAMESPACE, "SignupPerson", new SignupPerson().getClass());
            HttpTransportSE ahttp = new HttpTransportSE(URL);
            SoapPrimitive Res = null;
            try
            {
                ahttp.call(NAMESPACE+METHOD, envolope);
                Res = (SoapPrimitive) envolope.getResponse();
            }
            catch (Exception ex)
            {
                //ex.printStackTrace();
                result = -1;
            }
            if (result != -1)
            {
                result = Integer.parseInt(Res.toString());
            }
            Working.dismiss();
        }
    };
    Thread SS = new Thread(work);
    SS.start();
    switch (result)
    {
    case -1:
        showDialog(-1);
        break;
    case 0:
        showDialog(0);
        break;
    case 1:
        showDialog(1);
        break;
    case 2:
        showDialog(2);
        break;
        default:break;
    }   
}

@Override
protected Dialog onCreateDialog(int id)
{

    switch (id)
    {
    case -1:
        return new AlertDialog.Builder(this)
        .setTitle("error!")
        .setMessage("error connecting to the server. please try again")
        .setIcon(R.drawable.ic_error)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // TODO Auto-generated method stub

            }
        })
        .create();
    case 0:
        return new AlertDialog.Builder(this)
        .setTitle("error!")
        .setMessage("You have entered an Exists Email, Please try another one")
        .setIcon(R.drawable.ic_error)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // TODO Auto-generated method stub
            }
        }).create();
    case 1:
        return new AlertDialog.Builder(this)
        .setTitle("error!")
        .setMessage("Server Error, Please Try Again Later")
        .setIcon(R.drawable.ic_error)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // TODO Auto-generated method stub
            }
        })
        .create();
    case 2:
        return new AlertDialog.Builder(this)
        .setTitle("Registration successfully!")
        .setMessage("Click OK to Sign in and Start Usign Hello!!")
        .setIcon(R.drawable.ic_success)
        .setPositiveButton("OK", new DialogInterface.OnClickListener() {

            @Override
            public void onClick(DialogInterface arg0, int arg1) {
                // TODO Auto-generated method stub
                Intent i = new Intent(SignupActivity.this ,MainActivity.class);
                i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
                startActivity(i);
            }
        })
        .create();
    }
    return null;
}

ここで、SUPersonはユーザー情報を保持するオブジェクトであり、Web サービスへの接続が終了した後にresultどちらが表示されるかを示す整数です。AlertDialog

私の質問は、上記のコードを実行すると、アラート ダイアログ メッセージが表示されないということです。なぜ ?

4

1 に答える 1

0

AsyncTaskを使用すると、これを行うのがずっと簡単になります。スレッドを開始した直後にダイアログを表示しようとしているため、ダイアログが表示されない可能性があると思います。

AsyncTask を使用すると、別のスレッドの doInBackground() でサーバー接続を実行し、onPostExecute() でダイアログを呼び出すことができます。

それが理にかなっているかどうか教えてください!リンクは、それを使用する方法について非常に明確です。:)

編集: AsyncTask を使用すると、onProgressUpdate() メソッドで ProgressDialog を簡単に設定できることにも言及したいと思います。

于 2013-10-07T15:02:09.570 に答える