0

私は、リクエストとレスポンスがサーバーとの間で発生する多くのシナリオがあるAndroidアプリを持っています。例login: authentication_ ユーザーがusernameと を入力するとpassword、認証情報はサーバーから応答されたものに対して検証されます。

しかし、ネットワークが遅いために応答が遅くなり、Android が強制終了ダイアログ ボックスをポップアップ表示することがあります。これは非常に恥ずかしいことです。

サーバーにヒットするコードを別のスレッドで分離し、応答が得られるまで、コードを分離する方法があると考えていました。強制終了ではなく、プログレス バーを表示することがあります。それは良い解決策ですか?

コード例:

//this code will be called when user presses Login button on UI
public void authenticate(View view) {
      //the logic for authentication
      if(authentication==true){
         //go to home page
        }
}

上記のコードでは、応答が期待どおりに遅れたときに強制終了が発生しないように、認証のロジックを分離する方法を教えてください。

また、このような強制終了のシナリオに取り組むための他のより良いアプローチをいただければ幸いです。

4

3 に答える 3

4

実行に時間がかかるタスクをメイン スレッドに含めないでください。別のスレッドで httpCommunication を実行する必要があります。この ANR を回避できます。

ドキュメントの内容 >> Android では、アプリケーションの応答性は Activity Manager と Window Manager システム サービスによって監視されます。Android は、次の条件のいずれかを検出すると、特定のアプリケーションの ANR ダイアログを表示します。

応答性の設計と ANR の回避のために特別に作成されたこのドキュメントをお読みください

AsyncTaskも使用できます。

于 2012-08-09T09:16:49.870 に答える
0

AsyncTaskまたはhttp://loopj.com/android-async-http/を使用できます

その間、UI に進行状況ダイアログを表示します。サーバーからの応答が受信されると呼び出されるコールバック関数を提供します。

于 2012-08-09T09:46:33.857 に答える
0

以下のサンプルコードを使用してlogin処理を行います。AsyncTaskログインプロセスを実行するために使用できます。

を使用するLoginActivityクラスAsyncTask

  • ボタンLoginをクリックすると、私executingAsyncTask.
  • ログインプロセス中に、これは表示されますProgressDialog
  • プロセスの完了後、ProgressDialogを閉じて、ステータス メッセージをユーザーに表示します

クラスコード:

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class LoginActivity extends Activity {

    private Button login_Button = null;
    private EditText userNameText = null;
    private EditText passwordText = null;
    private String uName = "";
    private String pass = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_login);
        login_Button = (Button) findViewById(R.id.cmdDoLogin);

        userNameText = (EditText) findViewById(R.id.editTextUserName);
        passwordText = (EditText) findViewById(R.id.editTextPassword);

        login_Button.setOnClickListener(new OnClickListener() {

            public void onClick(View paramView) {
                uName = userNameText.getText().toString().trim();
                pass = passwordText.getText().toString().trim();
                if (uName.equals("") || pass.equals("")) {
                    Toast.makeText(LoginActivity.this,
                            "Fill both username and password fields",
                            Toast.LENGTH_SHORT).show();

                } else {
                    new LoginActivity.DoLoginProcess().execute(); // calling the AsyncTask here
                }
            }
        });

    }

    private class DoLoginProcess extends AsyncTask<Void, Void, Integer> {

        ProgressDialog pd = null;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pd = new ProgressDialog(LoginActivity.this);
            pd.setTitle("Logging In...");
            pd.setMessage("Please wait...");
            pd.setCancelable(false);
            pd.show();

        }

        @Override
        protected Integer doInBackground(Void... params) {
            int loginStatus = 0 ; // treat this as loginStatus. 0 = login failed; 1=login success. You can return this value to onPostExecute function

            //*********************************************
            // do login process over internet here. Hope you already have the code to do the login process over internet.
            //*********************************************         

            return loginStatus;
        }

        @Override
        protected void onPostExecute(Integer status) {
            super.onPostExecute(status);
            pd.dismiss(); // dismiss the progress dialog

            if (status == 0) { // login failed
                AlertDialog alertDialog = new AlertDialog.Builder(
                        LoginActivity.this).create();
                alertDialog.setTitle("Error");
                alertDialog.setMessage("Login failed");
                alertDialog.setButton("OK",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                LoginActivity.this.finish();
                                dialog.cancel();
                            }
                        });
                alertDialog.setIcon(android.R.drawable.ic_dialog_info);
                alertDialog.show();
            } else if(status == 1) { // login success
                AlertDialog alertDialog = new AlertDialog.Builder(
                        LoginActivity.this).create();
                alertDialog.setTitle("Success");
                alertDialog.setMessage("Login success");
                alertDialog.setButton("OK",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog,
                                    int which) {
                                LoginActivity.this.finish();
                                dialog.cancel();
                            }
                        });
                alertDialog.setIcon(android.R.drawable.ic_dialog_info);
                alertDialog.show();
            }
        }
    }


}

test_loginレイアウト XML ファイル:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/loginbglayout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:padding="10dp" >

    <TableLayout
        android:id="@+id/holderLayout"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true" >

        <TableRow
            android:id="@+id/row1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center" >

            <TextView
                android:id="@+id/textViewUserName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:gravity="right"
                android:text="UserName"
                android:textColor="#ffffff" />

            <EditText
                android:id="@+id/editTextUserName"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1" >
            </EditText>
        </TableRow>

        <TableRow
            android:id="@+id/row2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center" >

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginRight="10dp"
                android:gravity="right"
                android:text="Password"
                android:textColor="#ffffff" />

            <EditText
                android:id="@+id/editTextPassword"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:inputType="textPassword" />
        </TableRow>

        <TableRow
            android:id="@+id/row3"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:gravity="center" >

            <View
                android:layout_width="0dp"
                android:layout_height="2dip"
                android:layout_weight="1"
                android:focusable="false" />

            <Button
                android:id="@+id/cmdDoLogin"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="right"
                android:text="Login" >
            </Button>
        </TableRow>
    </TableLayout>

</RelativeLayout>
于 2012-08-09T10:15:50.450 に答える