추상 클래스 BaseActivity의 캡슐화

5491 단어
BaseActivity를 추상 클래스로 설정하고 다른 하위 Activity는 BaseActivity를 계승한다. 장점: 1) 하위 코드의 복잡도(공통 방법)를 간소화하고 계승 메커니즘을 통해 기본 클래스에 기본적으로 실현되어야 하는 공통 방법을 봉인하면 하위 클래스가 중복 코드를 작성하는 작업량을 줄이고 하위 클래스가 자신의 특유한 기능에 전념하도록 하며 코드의 가독성과 유지보수성을 높일 수 있다.2) 강제 규범 서브클래스 행위는BaseActivity를 추상 클래스로 설정하여 실현해야 할 방법을 미리 정의하고 서브클래스 실현과 관련된 방법을 강제하여 코드 규범성(계승 메커니즘)을 향상시킨다.3) UI 프레임워크로 페이지 중첩을 실현한다.BaseActivity에서 외부 인터페이스를 정의하여 하위 클래스Activity가 계승된 후 부모 클래스를 직접 호출하여 페이지 중첩을 실현할 수 있다.4) 일반적인 사용법은 Inflater 메커니즘을 이용하여 페이지 중첩을 실현한다.Android의 Inflater 메커니즘 덕분에 하위 클래스에서 Inflater를 통해 부모 클래스의 View를 채우는 것은 페이지 중첩이나 UI 프레임워크에 해당하는 내용을 채우는 것과 유사합니다.BaseActivity의 onCreate ()에서 추상적인 방법을 호출합니다. 추상적인 종류인 BaseActivity는 안드로이드 Manifest에 있을 필요가 없습니다.xml 설정, 구체적인 클래스가 아닙니다.하나의 클래스에 계승하여 추상 클래스가 되도록 하고 초기화된 추상 방법을 추가한다. 이런 클래스를 계승할 때 반드시 이러한 추상 방법을 실현해야 한다. 우리가 수동으로 추가하지 않아도 된다. 이렇게 하면 초기화 등 일부 조작을 잃어버리지 않을 것이다. 그리고 추상 클래스에서 이러한 초기화 방법을 onCreate () 방법에 추가해야 한다. 그러면 우리의 하위 클래스는BaseActivity에 계승하기만 하면다음과 같은 두 가지 장점이 있다. 1)findViews()init()setLinsteners()를 실현하는 초기화 방법을 수동으로 추가하지 않아도 된다.
2) 우리는 더 이상 모든Activity에서 이 세 가지 방법을 수동으로 호출할 필요가 없다. 왜냐하면 우리의BaseActivity는 이미 우리를 위해 봉인을 해 놓았기 때문이다. 이 세 가지 추상적인 방법을 다시 쓰면 된다.
다음 코드: Dagger2+BufferKnife
MainActivity의 코드:
package com.example.administrator.myapplication.Base;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.example.administrator.myapplication.dagger.component.ActivityComponent;
import com.example.administrator.myapplication.dagger.component.DaggerActivityComponent;
import com.example.administrator.myapplication.dagger.module.ActivityModule;

import butterknife.ButterKnife;

/**
 * Created on 2017/5/10.
 * Author:crs
 * Description:BaseActivity    
 */
public abstract class BaseActivity extends AppCompatActivity {

    private static final String TAG = "BaseActivity";
    public Context mContext;
    ActivityComponent mActivityComponent;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mActivityComponent = DaggerActivityComponent.builder().activityModule(new ActivityModule(this)).build();
        mContext = this;
        setContentView();
        //ButterKnife,this   Activity
        ButterKnife.bind(this);
        //Log.i(TAG,this+"");  MainActivity@53538dd8
        //Dagger2
        initInject();
        init();
    }

    //    
    public abstract void initInject();

    //    
    public abstract void setContentView();

    //     
    public abstract void init();

    //     
    public void showToast(String msg) {
        Toast.makeText(BaseActivity.this, msg, Toast.LENGTH_SHORT).show();
    }

    // Activity   ActivityComponent      
    public ActivityComponent getActivityComponent() {
        return mActivityComponent;
    }
}

ActivityComponent의 코드:
package com.example.administrator.myapplication;

import android.widget.TextView;

import com.example.administrator.myapplication.Base.BaseActivity;

import butterknife.BindView;
import butterknife.OnClick;


public class MainActivity extends BaseActivity  {

    //        ,         。
    //@Override
    //protected void onCreate(Bundle savedInstanceState) {
    //   super.onCreate(savedInstanceState);
    //    ButterKnife.bind(this);
    //}

    @BindView(R.id.tv_content)
    TextView tv_content;

    @Override
    public void initInject() {
        //    Activity,mActivityComponent()      ;
        //ActivityComponent   :   
        //ActivityModule:      presenter    ,     ,            。
        getActivityComponent().inject(this);
    }

    @Override
    public void setContentView() {
        setContentView(R.layout.activity_main);
    }
    
    @Override
    public void init() {
        
    }
    
    @OnClick(R.id.btn)
    public void loadData(){

    }
}
ActivityModule의 코드:
package com.example.administrator.myapplication.dagger.component;

;

import com.example.administrator.myapplication.MainActivity;
import com.example.administrator.myapplication.dagger.module.ActivityModule;

import dagger.Component;

/**
 * Created on 2017/5/10.
 * Author:crs
 * Description:ActivityComponent   
 */
@Component(modules = {ActivityModule.class})
public interface ActivityComponent {

    //  MainActivity
    void inject(MainActivity activity);
}

//로그 차단기 추가: 효과 보기
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
okHttpClientBuilder.addInterceptor(interceptor);
 
jar 패키지를 가져오는 대신 의존하는 방식을 추가합니다. 그렇지 않으면 방법 수가 65535를 초과하여 apk가 너무 커질 수 있습니다.
프로젝트 종속 관리:
compile 'com.alibaba:fastjson:1.2.37'
compile 'com.squareup.okhttp3:okhttp:3.3.1'
compile 'com.squareup.okhttp3:logging-interceptor:3.3.1'
compile 'com.squareup.okio:okio:1.13.0'
compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.5'
 
클래스 헤더 설명:
/**
 * Created on ${DATE}.
 * Author:crs
 * Description:
 */
 
이미 Bufferknife를 사용했기 때문에 사용하지 않아도 됩니다.
set On Clistener Listener(this) Login Act에는 불필요한 코드가 많습니다(버전 유지보수 시 삭제)
 
부모 클래스에 불러오기 대화상자와 숨기기 대화상자를 봉인합니다.
 
프로젝트의 초기화 방법: 부류 BaseActivity의 추상적인 방법
getLayoutId()
initParams()

좋은 웹페이지 즐겨찾기