1

別のクラス(ネットワーク通信用のAsyncTaskであるLoginService)を使用するLoginアクティビティを作成しました。

 public void onClick(View view) {

            if (editTextPassword.getText().toString() != null & editTextUsername.getText().toString() != null){

                new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString()).execute();

                if(loginSuccess!=false){
                //Used to move to the Cases Activity
                Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class);
                startActivity(casesActivity);
                }else{
                    Toast.makeText(getApplicationContext(),"Incorrect Details", Toast.LENGTH_LONG).show();
                }
             }
            else{
                //Display Toaster for error
                Toast.makeText(getApplicationContext(),"Please enter your details", Toast.LENGTH_LONG).show();
            }
        }

LoginServiceの実行が完了する前に、アクティビティはIntent変数を介して別のアクティビティにすでに移動しています。私はなぜなのか理解していない。LoginServiceの考え方は、ユーザーの資格情報を検証することです。trueが返された場合、他のアクティビティに切り替えることができます。

4

3 に答える 3

3

あなたはこのようにこれをしたくありません。は.execute()できるだけ早く開始されますが、時間内に価値が戻ってくるという保証はありません(おそらくそうしないことが保証されています)。loginSuccess

後のすべてnew LoginService(...).execute();はに移動する必要がありますonPostExecute()

private Context mContext = null;
public void setContext(Context context) {
    mContext = context;
}
@Override
protected void onPostExecute(Void result) {
    if(loginSuccess!=false){
        //Used to move to the Cases Activity
        Intent casesActivity = new Intent(mContext, CasesActivity.class);
        startActivity(casesActivity);
    }else{
        Toast.makeText(mContext,"Incorrect Details", Toast.LENGTH_LONG).show();
    }
}

次に、次のように呼び出す必要がありますsetContext()

LoginService service = new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString());
service.setContext(getApplicationContext());
service.execute();
于 2013-02-12T23:34:59.673 に答える
1

あなたは移動する必要があります

Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class);
            startActivity(casesActivity);
            }else{
                Toast.makeText(getApplicationContext(),"Incorrect Details",     Toast.LENGTH_LONG).show();
            }

LoginServiceのonPostExecuteに。

このようにして、asynctaskがその作業を完了したことを確認できます。

いずれにせよ、他のアクティビティが開始されるのは非常に奇妙です。これは、loginSuccessのtrueへの古い割り当てが原因である可能性があります。

于 2013-02-12T23:33:14.537 に答える
1

asynctaskから結果を返す方法は?

AsyncTaskfromの結果をキャッチしonPostExecute()ます。

@Override
public void onPostExecute(Boolean result)
{
    boolean loginSuccess = result;

    if(loginSuccess!=false) { 

         Intent casesActivity = new Intent(getApplicationContext(), CasesActivity.class);
         startActivity(casesActivity);
    }
    else {

        Toast.makeText(getApplicationContext(),"Incorrect Details", Toast.LENGTH_LONG).show();
    }

}

AsyncTaskの結果のデータ型は、3番目のTypeパラメーターによって異なります。

execute()時々、メソッドAsyncTaskが間違った結果を返すと思います。それは自分自身を返しAsyncTaskます

于 2013-02-12T23:36:40.033 に答える