AsyncTask process



我正在创建一个应用程序,当你使用用户名和密码登录时,它会从服务器请求信息。服务器的请求需要时间(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
    }
} 

我想你需要像这个一样的东西

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

称此为taks

public void onClick(View view) {
    new LoginTask(YourActivity.this).execute(name, password);
}

尝试实现android登录活动。在您的ADT中,在create new activity下选择:login activity这将为您生成以下模板代码:

/**
 * 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,但您可以将其更改为任何需要的内容。

您需要实现一个扩展AsyncTask的新类,在一个名为doInBackground的函数中完成所有广泛的工作,并使用一些其他常见方法(如onProgressUpdate)将结果发布到UI线程。快速搜索"android asynctask教程"会产生一些好的结果供您学习。

您的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
     }
 }

我对你的项目了解不够,无法将其作为一个临时项目,你必须对其进行一些自定义,但总体"方式"与此类似。

相关内容

  • 没有找到相关文章

最新更新