1

これが私のコードの一部です。ボタンをクリックすると、新しいスレッドとサーバーへの接続が開始されます。接続が成功した場合、アプリは新しいアクティビティを開始し、現在のアクティビティを終了する必要があります。誰かがそれを行うのに最適な方法を説明できますか?

    transThread.submit(new Runnable()
            {
                public void run()
                {
                    guiProgressDialog(true);
                    if(user.length() < 4) guiNotifyUser("Username must have at least 4 characters!");
                    else if(pass.length() < 4) guiNotifyUser("Password must have at least 4 characters!");
                    else if(!pass.equals(passrtp)) guiNotifyUser("Password is not same in both fields!");
                    else if(!isValidEmail(mail)) guiNotifyUser("Your email is not valid email address!");
                    else if(fname.equals("") || lname.equals("")) guiNotifyUser("All fields are mandatory!");
                    else {
                        try {
                            final String message = AutoDiaryHttpHelper.signUp(user, md5(pass), mail, fname, lname);
                            guiNotifyUser(message);
//if message equals something start new activity

                        }
                        catch(Exception e) {
                            e.printStackTrace();
                        }
                    }
                    guiProgressDialog(false);
                }
            });

            break;
4

2 に答える 2

3

そのためにrunOnUiThreadを使用できます。これは、その方法を示すSOの回答です。

私は個人的AsyncTaskにこれを使用するのが好きです。で作業を行ってから にdoInBackground()値を返し、そこからonPostExecute()を開始するActivityか、 で必要なことを行うことができますUI

AsyncTask ドキュメント

これは、基本的な構造と使用の重要な詳細を示す私の答えですAsyncTask

コメント内のコードから編集

logcat なしで発生している正確なエラーはわかりませんが、最初に表示される問題は、で初期化するときcontextですAsyncTaskgetApplicationContext()あなたは特にあなたのやり方では使いたくありません。はまだ初期化されていないNPEため、取得していると思います。あなたはコンストラクターcontextを渡しているので、あなたはただそうするでしょうContext

this.context = context

AsyncTaskただし、 yourは の内部クラスであるように見えます。これは、およびそのRegisterActivityのすべてのメンバー変数にアクセスできることを意味します。これは、の代わりに を使用して開始できることを意味します。RegisterActivityContextActivityRegisterActivity.thiscontext

    @Override
    protected void onPostExecute(String result)
    {                     
          super.onPostExecute(result);                       
          //if (result == "Successful registration!")                    
          //String i;
          //i = "da";
          context.startActivity(new Intent(RegisterActivity.this,LoginActivity.class));  // change this here

述べたように、コンストラクターはcontext内部クラスの場合は必要ありませんが、別のファイルの場合は次のようになります

class RegisterTask extends AsyncTask<String, Void, String>{

            Context context;
            private RegisterTask(Context context){
                    this.context = context;  // use the variable (context) passed in the constructor above
于 2013-06-20T16:41:49.553 に答える
0

これが私の問題を解決したコードです(CodeMagicのおかげです-これがこれを行うための最良の方法であるかどうかはわかりません):内部クラス:

class RegisterTask extends AsyncTask<String, Void, String>{


    @Override
    protected String doInBackground(String... params) {
        String message = null;
        EditText username = (EditText) findViewById( R.id.register_username_text );
        EditText password = (EditText) findViewById( R.id.register_password_text );
        EditText passwordrtp = (EditText) findViewById( R.id.register_repeatpassword_text );
        EditText email = (EditText) findViewById( R.id.register_email_text );
        EditText firstname = (EditText) findViewById( R.id.register_firstname_text );
        EditText lastname = (EditText) findViewById( R.id.register_lastname_text );
        final String user = username.getText().toString();
        final String pass = password.getText().toString();
        final String passrtp = passwordrtp.getText().toString();
        final String mail = email.getText().toString();
        final String fname = firstname.getText().toString();
        final String lname = lastname.getText().toString();

        guiProgressDialog(true);
        if(user.length() < 4) guiNotifyUser("Username must have at least 4 characters!");
        else if(pass.length() < 4) guiNotifyUser("Password must have at least 4 characters!");
        else if(!pass.equals(passrtp)) guiNotifyUser("Password is not same in both fields!");
        else if(!isValidEmail(mail)) guiNotifyUser("Your email is not valid email address!");
        else if(fname.equals("") || lname.equals("")) guiNotifyUser("All fields are mandatory!");
        else {
            try {
                message = AutoDiaryHttpHelper.signUp(user, md5(pass), mail, fname, lname);
                guiNotifyUser(message);//prosla vodi na sledeci activity "Succesfull registration"

            }
            catch(Exception e) {
                e.printStackTrace();
            }
        }
        guiProgressDialog(false);



        return message;
    }

    @Override
    protected void onPostExecute(String result)
    {
        super.onPostExecute(result);

        if (result.equalsIgnoreCase("Successful registration!"))
        {

            RegisterActivity.this.startActivity(new Intent(context,LoginActivity.class));
            RegisterActivity.this.finish();
        }


    }
}

ボタンリスナーから呼び出します:

public void onClick(View v) {

    switch(v.getId())
    {
    case R.id.register_register_button:

        RegisterTask registerTask = new RegisterTask();
        registerTask.execute();

        break;
于 2013-06-23T17:12:56.233 に答える