2

コンテキストをアクティビティからAsyncTaskクラスに渡そうとしています。問題は、コンテキストがnullであるということです。

私のAsyncTaskクラスには、次のものがあります

 public class LoginService extends AsyncTask<String, Void, String> {

      ....

 public Context context;


 public LoginService(){

}

public LoginService(String username, String password){
    this.username=username;
    this.password=password;
}


@Override
protected String doInBackground(String... params) {

    String userID = login(username, password);

    return userID;
}

protected void onPostExecute(String result){

     loginSuccess = result;

    if (loginSuccess!=fail){
       Intent casesActivity = new Intent(context, CasesActivity.class);
       casesActivity.putExtra("username", result);
       context.startActivity(casesActivity);
}

public void setContext(Context newContext){
    context = newContext;
}

そして、私のアクティビティでは、ボタンをクリックすると、次のコードが表示されます。

 public void onClick(View view) {

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

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

             }
            else{
                //Display Toaster for error
                Toast.makeText(getApplicationContext(),"Please enter your details", Toast.LENGTH_LONG).show();
            }
        }

インテントが作成されることはなく、コンテキストがnullであるため、アプリケーションが突然クラッシュします。この問題の解決策が見つからないようです。

4

1 に答える 1

3

最小限のコード変更のために、2つの別々のインスタンスを作成する代わりに、への参照を保持ますLoginTask

LoginService l = new LoginService(editTextUsername.getText().toString(), editTextPassword.getText().toString());

l.setContext (getApplicationContext());

l.execute();

コードはLoginTask毎回新しいコンストラクターを作成し、2つの別個のコンストラクターがあるため、context常にnullになります(別個のオブジェクトを作成したため、2番目のコンストラクターはコンテキストを保持しません!)

ただし、ユーザーの資格情報とともにコンテキストを渡す必要がある場合は、引数なしのコンストラクターを取り出し、残りのコンストラクターを次のように変更します。

public LoginService(Context context,String username, String password){
    this.context = context;
    this.username=username;
    this.password=password;
}

何もしない空のコンストラクターがあることは通常無意味なので、便利なコンストラクターを調整してさらに便利にします。

于 2013-02-13T00:30:29.493 に答える