android2014.04.15 17:59


http://www.androidviews.net/


좋은 자료가 많이 있네요!!



Posted by taewanKim
android2014.04.15 17:31

android 에서 xml로 view 의 높이나 너비의 실제 값을 알아내는 방법이 종종 필요할때가 있다.


예를 들어 너비의 두배로 높이를 정의 해줘야 할 때 라던지 몇가지 경우가 있다.



ViewTreeObserver.OnPreDrawListener 를 이용하여 화면에 그려지는 타이밍을 알 수 있는 것 같다.

(OnGlobalLayoutListener 도 가능한듯.)


멍때리고 예제를 따라하면 실수로 무한정 발생 할 수 있는데 이를 방지 하기위해서는

return 값을 true로 줘야 한다. 

public boolean onPreDraw() {
        ...
        return true;//필수!!
}


위의 방식대로 하면 무한정 발생은 막을 수 있다. 


하지만 값을 가지고 온 이후 화면이 갱싱 될 때 불필요하게 계속 가져오게 될 수 있다.


그래서 이벤트를 제거 해줘야 한다. 여기서 중요한건 밖에서 정의한 

ViewTreeObserver 를 사용하지 않고 새롭게 onPreDraw안에서 getViewTreeObserver 해야 정상 작동 한다는 점이다!


final Button btn2 = (Button) mRootView.findViewById(R.id.btn_2); final ViewTreeObserver obs = btn2.getViewTreeObserver(); Log.d("taewan", btn2.getWidth() + ":0"); obs.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {@ Override public boolean onPreDraw() { Log.d("taewan", btn2.getWidth() + ":1"); if (btn2.getWidth() != 0) { ViewTreeObserver vto = btn2.getViewTreeObserver(); vto.removeOnPreDrawListener(this); } return true; } });


OnWindowAttachListener를 이용하는게 더 이상적인거 같은데 API level 18  ㄷㄷㄷ 무려 18 이다..

아무튼 좋아 보인다.

ViewTreeObserver obs = view.getViewTreeObserver();
obs.addOnWindowAttachListener(new ViewTreeObserver.OnWindowAttachListener() {@
    Override
    public void onWindowDetached() {
        Log.d("taewan", "Detached:" + view.getWidth() );
    }

    @
    Override
    public void onWindowAttached() {
        Log.d("taewan", "Attached:" + view.getWidth() );
    }
});



끝!

Posted by taewanKim
ruby on rails2014.04.15 16:14

앞선 포스트에서 토큰 인증을 할 수 있도록 기본적인 작업을 진행 했습니다. 


그럼 토큰 인증을 위해 토큰을 생성하고 받아 올 수 있도록 하는 작업을 진행 해야 하겠죠?



API Sessions Controller (login and logout)


버젼 관리를 위해서 app/controller/api/v1/ 라는 폴더를 만들고 진행을 합니다.


1. sessions_controller.rb 파일을 생성해서 아래의 코드를 삽입합니다.

    아래의 코드에서는 로그인과 로그아웃을 관리 하게 도와줍니다!

# file: app/controller/api/v1/sessions_controller.rb
class Api::V1::SessionsController < Devise::SessionsController
  skip_before_filter :verify_authenticity_token,
                     :if => Proc.new { |c| c.request.format == 'application/json' }

  respond_to :json

  def create
    warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
    render :status => 200,
           :json => { :success => true,
                      :info => "Logged in",
                      :data => { :auth_token => current_user.authentication_token } }
  end

  def destroy
    warden.authenticate!(:scope => resource_name, :recall => "#{controller_path}#failure")
    current_user.update_column(:authentication_token, nil)
    render :status => 200,
           :json => { :success => true,
                      :info => "Logged out",
                      :data => {} }
  end

  def failure
    render :status => 401,
           :json => { :success => false,
                      :info => "Login Failed",
                      :data => {} }
  end
end


2. routes 에 controller 연결

# file: config/routes.rb
namespace :api do
  namespace :v1 do
    devise_scope :user do
      post 'sessions' => 'sessions#create', :as => 'login'
      delete 'sessions' => 'sessions#destroy', :as => 'logout'
    end
  end
end


3. rails console 에서 가짜 유저 생성.

User.create(:email => 'user@example.com', :password => '12345678', :password_confirmation => '12345678')


4. 로그인 테스트

curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST http://localhost:3000/api/v1/sessions -d "{\"user\":{\"email\":\"user@example.com\",\"password\":\"12345678\"}}"


5. 성공적인 로그인

json 형태가 마음에 드네요 

success: true | false, info : "내용" , data: {결과 데이터} 

다른 부분들에서도 이런식으로 작업 하면 좋을거 같습니다.

{"success":true,"info":"Logged in","data":{"auth_token":"P-7Cfs15_EyCm-hGYkUe"}}


6. 로그인 실패

{" success":false,"info":"login="" failed","data":{}}


7. 로그 아웃 테스트

curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X DELETE http://localhost:3000/api/v1/sessions?auth_token=P-7Cfs15_EyCm-hGYkUe


8. 성공적인 로그 아웃

로그 아웃시 auth_token을 삭제하는데 다양한 기기를 쓴다면 꼭 필요한 부분은 아닌 것 같습니다.

대신 로그인시 auth_token을 갱신해준다면 한명의 로그인 유저만(동시 로그인 방지)을 유지 할 수 있겠네요 :)

{"success":true,"info":"Logged out","data":{}}


9. 로그인 상태 유지

페이지를 로드할때 prams에 auth_token값을 넣어주면 로그인된 상태를 유지 할 수 있습니다.


#curl -v -H 'Content-Type: application/json' http://localhost:3000/users/edit?auth_token=P-7Cfs15_EyCm-hGYkUe #[test]수정이 가능한 html이 출력 됩니다.
http://localhost:3000?auth_token=P-7Cfs15_EyCm-hGYkUe



API Registrations Controller (register a new user)


이제 로그인을 위한 부분들은 완료가 되었습니다.

회원 가입쪽을 살펴보도록 합시다.


1. registrations_controller.rb 파일을 생성해서 아래의 코드를 삽입합니다.aaa

# file: app/controllers/api/v1/registrations_controller.rb
class Api::V1::RegistrationsController < Devise::RegistrationsController
  skip_before_filter :verify_authenticity_token,
                     :if => Proc.new { |c| c.request.format == 'application/json' }

  respond_to :json

  def create
    build_resource(sign_up_params)
    if resource.save
      sign_in resource
      render :status => 200,
           :json => { :success => true,
                      :info => "Registered",
                      :data => { :user => resource,
                                 :auth_token => current_user.authentication_token } }
    else
      render :status => :unprocessable_entity,
             :json => { :success => false,
                        :info => resource.errors,
                        :data => {} }
    end
  end

  private 
  def sign_up_params
    devise_parameter_sanitizer.sanitize(:sign_up)
  end
end


2. routes에 추가!

# file: config/routes.rb
namespace :api do
  namespace :v1 do
    devise_scope :user do
      post 'registrations' => 'registrations#create', :as => 'register' #[추가]회원가입
      post 'sessions' => 'sessions#create', :as => 'login'
      delete 'sessions' => 'sessions#destroy', :as => 'logout'
    end
  end
end


3. 회원가입 테스트

curl -v -H 'Content-Type: application/json' -H 'Accept: application/json' -X POST http://localhost:3000/api/v1/registrations -d "{\"user\":{\"email\":\"user1@example.com\",\"password\":\"12345678\",\"password_confirmation\":\"12345678\"}}"


4. 성공적인 회원가입

{"success":true,"info":"Registered","data":{"user":{"id":4,"email":"user1@example.com","authentication_token":"v1u6Xxs87q4WQvVKFbGJ","created_at":"2014-04-15T07:08:38.442Z","updated_at":"2014-04-15T07:08:38.449Z"},"auth_token":"v1u6Xxs87q4WQvVKFbGJ"}}


5. 회원가입 실패

{"success":false,"info":{"email":["has already been taken"]},"data":{}}






이렇게 로그인 로그아웃 회원 가입방법을 알아 보았습니다!


android나 ios 에서는  http://localhost:3000?auth_token=P-7Cfs15_EyCm-hGYkUe 이렇게 이용하시면 로그인상태를 유지 시킬 수 있습니다.




출처는 여기

생기는 오류들을 몇가지를 수정하면서 진행한 포스트 였습니다.



'ruby on rails' 카테고리의 다른 글

[controller]devise와 android app 연동하기!  (0) 2014.04.15
[model]devise와 android app 연동하기!  (0) 2014.04.15
Posted by taewanKim