1

ユーザーに登録を促すアプリケーションを構築しています。バックエンドで実行されているdjango-restfulサーバーがあり、 DefaultHttpClientクラスを使用してAndroidクライアント上のサーバーにHTTPポストリクエストを作成しようとしています。ユーザーからメール、ユーザー名などを取得し、ボタンの onClick イベントで、リクエストを実行するAsnycTaskを作成します。アクティビティのコードは次のとおりです。

registerButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {
        String userName = usernameEditText.getText().toString();
        String email = emailEditText.getText().toString();
        String password = passwordEditText.getText().toString();

        if( userName != null && email != null && password != null) {
            new RegisterEventHandler().execute(userName , email , password);
        }
    }

});

  ....

    class RegisterEventHandler extends AsyncTask<String, Integer, Boolean> {

    @Override
    protected Boolean doInBackground(String... params) {            
        RequestHandler handler = new RequestHandler();
        return handler.register(params[0], params[1], params[2]);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        if( result ) {
            AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
            builder.setTitle(R.string.RegisterSuccessfullTitle);
            builder.setMessage(R.string.RegisterSuccessfullMessage);
            builder.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {                  

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Intent redirect = new Intent(getApplicationContext() , SmartMapMainActivity.class);
                    startActivity(redirect);
                }

            });

            builder.create().show();
        }
        else {
            AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext());
            builder.setTitle(R.string.RegisterFailedTitle);
            builder.setMessage(R.string.RegisterFailedMessage);
            builder.create().show();
        }
    }       
}

RequestHandler クラス:

public class RequestHandler {

public boolean register(String userName , String email , String password) {
    HttpClient httpClient = new DefaultHttpClient();
    HttpPost httpPost = new HttpPost("http://127.0.0.1/users/");

    try {
        JSONObject jsonObj = new JSONObject();
        jsonObj.put("username", userName);
        jsonObj.put("email", email);
        jsonObj.put("password", password);      

        StringEntity entity = new StringEntity(jsonObj.toString());
        entity.setContentType("application/json");
        httpPost.setEntity(entity);

        HttpResponse response = httpClient.execute(httpPost);
        if(response.getStatusLine().getStatusCode() == 200)
            return true;
        else
            return false;

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    }

    return false;

}
}

問題は、DefaultHttpClientの connManager(ClientConnectionManager) が常にnullであり、 HttpClientexecute()メソッドで常にIOExceptionをスローすることです。AsyncTask のdoInBackgroundメソッドではなく、自分の activity でDefaultHttpClientを初期化しようとしましたが、結果は同じでした。

4

0 に答える 0