Android MVP模式中,一个Activity对应多个Presenter时该怎样抽象?
阿神
阿神 2017-04-18 09:14:49
0
3
1303

这是网上常见的MvpActivity基类

public abstract class BaseMvpActivity<t extends BaseAdapter> extends AppCompatActivity {   
 
    public T presenter;    
 
     @Override  
     protected void onCreate(Bundle savedInstanceState) {        
         super.onCreate(savedInstanceState);        
         presenter = initPresenter();   
     }    
 
     @Override   
     protected void onResume() {        
          super.onResume();        
          presenter.attach((V)this);    
     }    
 
     @Override   
     protected void onDestroy() {       
        presenter.dettach();        
        super.onDestroy();    
     }   
 
     public abstract T initPresenter();
 
}

这个基类完成了presenter的实例化、presenter持有的Activity对象的释放.
那么当一个Activity有多个功能时,应该怎样实现呢。

我想,一种方法是让一个presenter实现多个功能,这时可以继续用上面的基类,但是程序的功能不容易复用。比如Activity1有功能A和B,Activity2有功能C和D,当Activity3有功能A和D时,无法复用Activity1和2的presenter; 一种方法是一个Activity持有多个presenter,这时就要重写BaseActivity,我写了一个,如下:

public abstract class MvpActivity extends BaseActivity {
    protected Map<String, BasePresenter> presenters;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        presenters = createPresenter();
        super.onCreate(savedInstanceState);
    }

    protected abstract Map<String, BasePresenter> createPresenter();

    @Override
    protected void onDestroy() {
        super.onDestroy();
        for (Map.Entry<String, BasePresenter> entry : presenters.entrySet()) {
            if (entry.getValue() != null) {
                entry.getValue().detachView();
            }
        }
    }

    protected BasePresenter getPresenter(){
        return presenters.entrySet().iterator().next().getValue();
    }

    protected BasePresenter getPresenter(String key){
        return presenters.get(key);
    }
}

但是这个基类使用起来很别扭,说他别扭是因为:
在第一版中有public T presenter这个变量,可以直接调用presenter的功能,第二版中首先要调用getPresenter,还要类型转换才能使用。还有在createPresenter抽象方法实现起来不想第一版那么直观。

我JAVA功力不够,还请各位指点一下。

阿神
阿神

闭关修行中......

membalas semua(3)
PHPzhong

Aktiviti sepadan dengan penyampai A, dan kemudian penyampai yang sepadan A boleh dikembangkan Ia hanya digunakan sebagai kelas proksi dan pelaksanaan khusus lain dilaksanakan oleh penyampai B, C dan D yang lain. Dengan cara ini, terdapat. tidak perlu menukar aktiviti Kaedah memanggil juga boleh menggunakan semula penyampai, tetapi ia berasa pelik. . .

左手右手慢动作

Terdapat kekangan protokol antara View dan Presenter
Dengan mengandaikan bahawa terdapat V1, P1, V2, P2, dan ActivityA yang sedia ada sepadan dengan fungsi P1/P2, ia juga harus menunjukkan bahawa ia melaksanakan V1/. Antara muka V2. Ini Harus ada PresenterA yang melaksanakan P1 dan P2 Ini adalah protokol VP yang lengkap.
Memandangkan berbilang halaman mungkin menggunakan fungsi yang sama, cara paling mudah ialah menggunakan berbilang warisan pada nod saya (satu pelaksanaan Pembentang ABCD empat. antara muka), supaya tidak kira Aktiviti benar-benar menggunakan Penyampai yang sama Jika anda pasti ia telah dilaksanakan sekarang, hanya melaksanakan proksi mengikut kaedah di atas

Jika anda benar-benar mahu melaksanakan berbilang Penyampai, anda boleh mentakrifkan beberapa kelas berbeza untuk menyokong lanjutan berbilang Penyampai yang berbeza:

class BaseMvpActivity1<P> extent BaseActivity {
    P presenter;
}
class BaseMvpActivity2<P1, P2> extent BaseActivity {
    P1 presenter1;
    P2 presenter2;
}
Tetapi ini tidak disyorkan (kehilangan abstraksi dan melanggar prinsip penyongsangan kebergantungan juga tidak disyorkan untuk menggunakan tatasusunan atau Senarai (kelas asas menggunakan generik untuk memudahkan penyemakan pengkompil, dan tatasusunan atau Senarai perlu ditaip apabila digunakan). khususnya)

大家讲道理

http://blog.csdn.net/github_3... Terdapat pengenalan di dalamnya

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan