mercredi 3 janvier 2018

Pass an object in android mvp?

recently I been reading about the mvp pattern on Internet and to be honest, it has been a little bit confusing.

I'm trying to re-write an app using the mvp pattern but I reached a point using AsyncTask where I can't figure out how to pass the Object in the Interactor back to the View.

Here'e the code:

View:

public class DetailsActivity extends BaseActivity {

private DetailsPresenter presenter;
private Pet pet;
private TextView name, description, breed, lostAt, age;
private int idList;

@Override
protected void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.details_layout);

    DetailsPresenter presenter = new DetailsPresenter();
    Typeface font0 = Typeface.createFromAsset(getAssets(), "fonts/CaviarDreams.ttf");
    Typeface font1 = Typeface.createFromAsset(getAssets(), "fonts/CaviarDreams_Bold.ttf");
    TextView txtDescription = findViewById(R.id.textView8);
    TextView txt1 = findViewById(R.id.textView6); //Age, Type
    TextView txt2 = findViewById(R.id.textView9); //LostAt
    Button btnContact = findViewById(R.id.button6);
    description = findViewById(R.id.details);
    menuRes = R.menu.details_menu;
    name = findViewById(R.id.textView10);
    breed = findViewById(R.id.breed);
    lostAt = findViewById(R.id.lostAt);
    age = findViewById(R.id.age);

    name.setTypeface(font1);
    breed.setTypeface(font0);
    description.setTypeface(font0);
    lostAt.setTypeface(font0);
    txtDescription.setTypeface(font1);
    txt2.setTypeface(font1);
    txt1.setTypeface(font1);
    btnContact.setTypeface(font0);

    idList = getIntent().getExtras().getInt("TAG_LIST");
    id = getIntent().getExtras().getInt("TAG_ID");

    if(idList == 0){
        txt1.setText(R.string.type);
        txt2.setText(R.string.txt2);
    } else{
        txt1.setText(R.string.txt0);
        txt2.setText(null);
    }

    btnContact.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(getApplicationContext(), ChatFragment.class);
            startActivity(intent);
        }
    });

//        Get pet details from database on background
    pet = presenter.getPet(idList, id);
}

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

    if(idList == 0){
        name.setText(pet.getName());
        breed.setText("(" + pet.getBreed() + ")");
        description.setText(pet.getDescription());
        lostAt.setText(pet.getLocation());
    }else{
        name.setText(pet.getBreed());
        description.setText(pet.getDescription());
        lostAt.setText(pet.getGender());
        age.setText(pet.getAge());
    }
}

}

Presenter:

public class DetailsPresenter {

private DetailsInteractor interactor;

public Pet getPet(int idList, int id) {

    interactor = new DetailsInteractor(idList, id);
    interactor.execute();

    return interactor.pet;
}

}

Interactor:

public class DetailsInteractor extends AsyncTask<String, String, Pet> {

public Pet pet;
private int idList;
private int id;
private DBAction database;

public DetailsInteractor (int idList, int id) {

    this.idList = idList;
    this.id = id;

    database = new DBAction();
}

@Override
protected Pet doInBackground(String... strings) {

    pet = database.requestItem(idList, id);
    return pet;
}

I need that after getting the data from the database, it updates the View, using object Pet.

Any answers and suggestions will be welcomed, Thanks!

Aucun commentaire:

Enregistrer un commentaire