0

私はアプリを作成しています。ユーザー名とパスワードを使用してログインすると、サーバーに情報が要求されます。サーバーのリクエストには時間がかかります(15〜20秒)。その間、回転するバーをいくつかの単語で表示したいと思います。しかし、私はクラスの非常に多くのバリエーションを試しましたAsyncTask、そして私はそれを機能させることができません。情報は問題なく取得されますが、応答するまで画面がフリーズします。今、私は新しいスレッドを実装していrunnableます。コードのどこからを呼び出す必要があるのか​​わかりませんAsyncTask

onClickトリガーは次の機能attemptLogin()をトリガーします。

    public void onClick(View view) {
        attemptLogin();
    }

機能中attemptLogin()

// more code
showProgress(true);
new Thread(new GetServerResponseRunnable()).start();
while (wait) {}
// more code

そして、Runnableは次のとおりです。

public class GetServerResponseRunnable implements Runnable {
    @Override
    public void run() {
        response = getInfo.getTours(mUsername, mPassword);
        wait = false;   
    }       

}  

ご覧のとおり、別のクラスから別の関数を呼び出します。これは機能です:

public String getTours(String username, String password) {
    String req = "GETALLDATA";
    String retStr = "";
    try {
        url = getURL(req, username, password);
        sendOutputLine(url, "");
        retStr = getReturnString();
        Log.d(LoginActivity.DEBUG_TAG, "getTours() return: " + retStr);
    } catch (Exception e) {
        Log.d(LoginActivity.DEBUG_TAG, "programm bommed client: " + e.getMessage());
    }
    return retStr;
}   

助けが必要です。主に私がやりたいことは次のとおりです。

    response = getInfo.getTours(mUsername, mPassword);
    wait = false;

その間、回転するバーを表示します。

ありがとう


更新:2013年2月13日

このコードを使用しましたが、

02-13 09:07:16.142: E/AndroidRuntime(1046): java.lang.NullPointerException

行で:

this.dialog.setMessage(getResources().getString(R.string.login_progress_signing_in));

なぜですか?

public class LoginTask extends AsyncTask<Object, Void, String> {

    public Context context;
    public ProgressDialog dialog;


    public void BaseTask(Context context) {
        this.context = context;
        this.dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        this.dialog.setMessage(getResources().getString(R.string.login_progress_signing_in));
        this.dialog.show();

    }

    @Override
    protected String doInBackground(Object... objects) {
        String name = (String) objects[0];
        String password = (String) objects[1];
        String response = getInfo.getTours(name , password );
        return response;
    }

    @Override
    protected void onPostExecute(String response) {
        if (dialog != null && dialog.isShowing())
            dialog.dismiss();

        LoginActivity.response = response; 

        // process response as you need
    }
} 
4

4 に答える 4

1

私はあなたがこのようなものが必要だと思います

public class LoginTask extends AsyncTask<Object, Void, String> {

    public Context context;
    public ProgressDialog dialog;


    public BaseTask(Context context) {
        this.context = context;
        this.dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        this.dialog.setMessage(context.getResources().getString(R.string.loading));
        this.dialog.show();

    }

    @Override
    protected String doInBackground(Object... objects) {
        String name = (String) objects[0];
        String password = (String) objects[1];
        String response = getInfo.getTours(name , password );
        return response;
    }

    @Override
    protected void onPostExecute(String response) {
        if (dialog != null && dialog.isShowing())
            dialog.dismiss();

        // process response as you need
    }
}

これをタクと呼ぶ

public void onClick(View view) {
    new LoginTask(YourActivity.this).execute(name, password);
}
于 2013-02-12T20:41:21.233 に答える
0

Androidのログインアクティビティを実装してみてください。ADTで、新しいアクティビティの作成を選択します。ログインアクティビティこれにより、次のテンプレートコードが生成されます。

/**
 * Activity which displays a login screen to the user, offering registration as
 * well.
 */
public class LoginActivityTest extends Activity {
    /**
     * A dummy authentication store containing known user names and passwords.
     * TODO: remove after connecting to a real authentication system.
     */
    private static final String[] DUMMY_CREDENTIALS = new String[] {
            "foo@example.com:hello", "bar@example.com:world" };

    /**

         * The default email to populate the email field with.
         */
        public static final String EXTRA_EMAIL = "com.example.android.authenticatordemo.extra.EMAIL";

        /**
         * Keep track of the login task to ensure we can cancel it if requested.
         */
        private UserLoginTask mAuthTask = null;

        // Values for email and password at the time of the login attempt.
        private String mEmail;
        private String mPassword;

        // UI references.
        private EditText mEmailView;
        private EditText mPasswordView;
        private View mLoginFormView;
        private View mLoginStatusView;
        private TextView mLoginStatusMessageView;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_login_activity_test);

            // Set up the login form.
            mEmail = getIntent().getStringExtra(EXTRA_EMAIL);
            mEmailView = (EditText) findViewById(R.id.email);
            mEmailView.setText(mEmail);

            mPasswordView = (EditText) findViewById(R.id.password);
            mPasswordView
                    .setOnEditorActionListener(new TextView.OnEditorActionListener() {
                        @Override
                        public boolean onEditorAction(TextView textView, int id,
                                KeyEvent keyEvent) {
                            if (id == R.id.login || id == EditorInfo.IME_NULL) {
                                attemptLogin();
                                return true;
                            }
                            return false;
                        }
                    });

            mLoginFormView = findViewById(R.id.login_form);
            mLoginStatusView = findViewById(R.id.login_status);
            mLoginStatusMessageView = (TextView) findViewById(R.id.login_status_message);

            findViewById(R.id.sign_in_button).setOnClickListener(
                    new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {
                            attemptLogin();
                        }
                    });
        }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            super.onCreateOptionsMenu(menu);
            getMenuInflater().inflate(R.menu.activity_login_activity_test, menu);
            return true;
        }

        /**
         * Attempts to sign in or register the account specified by the login form.
         * If there are form errors (invalid email, missing fields, etc.), the
         * errors are presented and no actual login attempt is made.
         */
        public void attemptLogin() {
            if (mAuthTask != null) {
                return;
            }

            // Reset errors.
            mEmailView.setError(null);
            mPasswordView.setError(null);

            // Store values at the time of the login attempt.
            mEmail = mEmailView.getText().toString();
            mPassword = mPasswordView.getText().toString();

            boolean cancel = false;
            View focusView = null;

            // Check for a valid password.
            if (TextUtils.isEmpty(mPassword)) {
                mPasswordView.setError(getString(R.string.error_field_required));
                focusView = mPasswordView;
                cancel = true;
            } else if (mPassword.length() < 4) {
                mPasswordView.setError(getString(R.string.error_invalid_password));
                focusView = mPasswordView;
                cancel = true;
            }

            // Check for a valid email address.
            if (TextUtils.isEmpty(mEmail)) {
                mEmailView.setError(getString(R.string.error_field_required));
                focusView = mEmailView;
                cancel = true;
            } else if (!mEmail.contains("@")) {
                mEmailView.setError(getString(R.string.error_invalid_email));
                focusView = mEmailView;
                cancel = true;
            }

            if (cancel) {
                // There was an error; don't attempt login and focus the first
                // form field with an error.
                focusView.requestFocus();
            } else {
                // Show a progress spinner, and kick off a background task to
                // perform the user login attempt.
                mLoginStatusMessageView.setText(R.string.login_progress_signing_in);
                showProgress(true);
                mAuthTask = new UserLoginTask();
                mAuthTask.execute((Void) null);
            }
        }

        /**
         * Shows the progress UI and hides the login form.
         */
        @TargetApi(Build.VERSION_CODES.HONEYCOMB_MR2)
        private void showProgress(final boolean show) {
            // On Honeycomb MR2 we have the ViewPropertyAnimator APIs, which allow
            // for very easy animations. If available, use these APIs to fade-in
            // the progress spinner.
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB_MR2) {
                int shortAnimTime = getResources().getInteger(
                        android.R.integer.config_shortAnimTime);

                mLoginStatusView.setVisibility(View.VISIBLE);
                mLoginStatusView.animate().setDuration(shortAnimTime)
                        .alpha(show ? 1 : 0)
                        .setListener(new AnimatorListenerAdapter() {
                            @Override
                            public void onAnimationEnd(Animator animation) {
                                mLoginStatusView.setVisibility(show ? View.VISIBLE
                                        : View.GONE);
                            }
                        });

                mLoginFormView.setVisibility(View.VISIBLE);
                mLoginFormView.animate().setDuration(shortAnimTime)
                        .alpha(show ? 0 : 1)
                        .setListener(new AnimatorListenerAdapter() {
                            @Override
                            public void onAnimationEnd(Animator animation) {
                                mLoginFormView.setVisibility(show ? View.GONE
                                        : View.VISIBLE);
                            }
                        });
            } else {
                // The ViewPropertyAnimator APIs are not available, so simply show
                // and hide the relevant UI components.
                mLoginStatusView.setVisibility(show ? View.VISIBLE : View.GONE);
                mLoginFormView.setVisibility(show ? View.GONE : View.VISIBLE);
            }
        }

        /**
         * Represents an asynchronous login/registration task used to authenticate
         * the user.
         */
        public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
            @Override
            protected Boolean doInBackground(Void... params) {
                // TODO: attempt authentication against a network service.

                try {
                    // Simulate network access.
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    return false;
                }

                for (String credential : DUMMY_CREDENTIALS) {
                    String[] pieces = credential.split(":");
                    if (pieces[0].equals(mEmail)) {
                        // Account exists, return true if the password matches.
                        return pieces[1].equals(mPassword);
                    }
                }

                // TODO: register the new account here.
                return true;
            }

            @Override
            protected void onPostExecute(final Boolean success) {
                mAuthTask = null;
                showProgress(false);

                if (success) {
                    finish();
                } else {
                    mPasswordView
                            .setError(getString(R.string.error_incorrect_password));
                    mPasswordView.requestFocus();
                }
            }

            @Override
            protected void onCancelled() {
                mAuthTask = null;
                showProgress(false);
            }
        }
    }

ここUserLoginTaskで認証を行います。これにより、ログインしようとしているときにスピナーを表示できます。'onPostExecute'は、確認時に次のアクティビティに移動するか、無効なパスワードなどのユーザーへのメッセージを表示してログイン画面に戻る場所になります。

テンプレートには、サーバーで認証する場合は不要なdummy_credentialsが含まれており、電子メールとパスワードのtextEditsが付属していますが、これらは任意に変更できることに注意してください。

于 2013-02-12T20:40:43.453 に答える
0

拡張する新しいクラスを実装し、とAsyncTask呼ばれる関数内ですべての広範な作業を実行しdoInBackground、などの他の一般的なメソッドを使用して結果をUIスレッドに公開する必要がありonProgressUpdateます。「androidasynctasktutorial」をウェブですばやく検索すると、学ぶための良い結果が得られます。

于 2013-02-12T20:42:25.060 に答える
0

AsyncTaskは次のようになります。

 private class DownloadFilesTask extends AsyncTask<Login, Void, Tours> {
     protected void onPreExecute(){
        //show the dialog here
     }

     protected Long doInBackground(URL... urls) {
         Tours response = getInfo.getTours(Login.mUsername, Login.mPassword);
         return response;
     }


     protected void onPostExecute(Long result) {
         //hide the dialog here
     }
 }

あなたのプロジェクトをドロップインにするのに十分な知識がありません。少しカスタマイズする必要がありますが、全体的な「方法」はこれに似ています。

于 2013-02-12T20:43:18.930 に答える