【问题标题】:Pass an object in android mvp?在android mvp中传递一个对象?
【发布时间】:2018-01-03 17:50:00
【问题描述】:

最近我在互联网上阅读了有关 mvp 模式的信息,老实说,这有点令人困惑。

我正在尝试使用 mvp 模式重新编写一个应用程序,但我使用 AsyncTask 达到了一个点,我无法弄清楚如何将交互器中的对象传递回视图。

代码如下:

查看:

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());
    }
}

}

演讲者:

public class DetailsPresenter {

private DetailsInteractor interactor;

public Pet getPet(int idList, int id) {

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

    return interactor.pet;
}

}

交互者:

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;
}

我需要在从数据库中获取数据后,使用对象 Pet 更新视图。

欢迎任何答案和建议,谢谢!

【问题讨论】:

    标签: android design-patterns mvp


    【解决方案1】:

    当您在 Activity(这是您的视图)中创建/初始化演示者时,您应该将视图传递给演示者。像这样的。

     DetailsPresenter presenter = new DetailsPresenter(View view);
    

    View 可以是任何对象,您可以使用它更新 UI 或调用 Activity 中的方法。

    此外,你必须通过几个好的网站来了解 MVP。

    http://valokafor.com/learn-android-mvp-pattern-example/ 这真是个好东西。

    【讨论】:

    • 谢谢@lib4 我阅读了你给我的链接,它非常有用。我还有一个问题,因为我正在使用 AsyncTask,一旦 AsyncTask 完成,我该如何执行该方法?否则,每当我尝试更新 TextView 时,我都会得到一个 NullPointer
    • 能否请您支持我的回答并接受。所以它也会帮助其他人。谢谢。
    • 我发错之前的评论,我更新了
    • 尝试在 onPostExecute 中执行如下示例 protected void onPostExecute(Long result) { update UI// }
    • 请点赞并接受答案,因为它会帮助其他人。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 2021-08-07
    • 2018-10-10
    • 2021-12-10
    相关资源
    最近更新 更多