如何做到以下

时间:2017-05-14 16:28:28

标签: java android json

我有一个名为JobModel的java类,它实现了IModel接口。该模型包含一个项目。

public interface IModel<T> { T Instantiate(JSONObject o); }

引用的函数在JobModel类中看起来像这样。

public IModel<JobModel> Instantiate(JSONObject o) {
    JobModel j = new JobModel();

    try {
        j.setID(o.getInt("ID"));
        j.setName(o.getString("Name"));
        j.setDescription(o.getString("Description"));
    }
    catch (Exception e) { e.printStackTrace(); }

    return j;
}

我有一个名为BaseController的控制器,它采用Generic Type。该控制器实现IOnAsyncResult和IController。这两个都是我设置的自定义界面。

我想要做的是实现一个框架,允许我挂钩到调用API的过程,我有以下实现。

这是从API AsyncTask类

调用的函数
public void onResultSuccess(int resultCode, JSONArray results) {
    ProcessJsonArray(results);

    try { if (this.viewDelegate != null) this.viewDelegate.InterfaceUpdate(list); }
    catch (Exception e) { e.printStackTrace(); }
}

JSON数组在ProcessJsonArray函数中处理,即:

public void ProcessJsonArray(JSONArray a) {
    for (int i=0; i < a.length(); i++) {
        try { list.add(this.ProcessJsonObject(a.getJSONObject(i))); }
        catch (Exception e) { e.printStackTrace(); }
    }
}

在ProcessJsonObject中处理各个JSON对象,即:

public IModel<T> ProcessJsonObject(JSONObject o) {
    return model.Instantiate(o);
}

模型字段是一个类字段,它在Controller的构造函数中实例化,特指扩展基本控制器类的控制器。

这一切都很好,除了模型,列表和resultsList以这种方式设置:

public ArrayList<IModel<T>> list;
public ArrayList<IModel<T>> resultsList;
public IModel<T> model;

当我尝试使用任何属性时,我发现了挑战。例如,当我尝试使用作业控制器设置时迭代列表属性时,我无法访问作业模型的Getter和Setter函数。迭代设置如下:

for (IModel<JobModel> j : list) {
    if (j.getName().contains(Value)) { addToResultsList(j); }
    //Additional else/if statements removed for bravity.  
}

如何访问当前设置的Getter / Setter函数,或者完成像这样的松耦合框架的正确设置是什么?

1 个答案:

答案 0 :(得分:0)

由于这篇文章没有引发任何讨论,我想我会发布我所做的工作来解决这个问题。

主要问题是访问模型类的Getters和Setter。因此,我从定义的属性(单个对象和列表对象)移动了IModel。

还从每个模型中删除了IModel实现,这允许我将Instantiation函数声明为static。

然后我在我的基本控制器类中实现了这个私有函数。

@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    switch (requestCode) {
        case 1:
            if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                // PERMISSION WAS GRANTED
            } else {
                // USER DID NOT GRANT PERMISSION
            }
            break;
    }
}

这样,允许我调用特定模型类型的Instantiate函数。唯一要考虑的是你必须将调用函数中的返回值强制转换为泛型类型,如下所示:

private Object ReturnPopulatedModelObject(JSONObject o)
{
    if (model instanceof PersonModel) { return PersonModel.Instantiate(o); }
    else if (model instanceof ContactModel) { return ContactModel.Instantiate(o); }
    else if (model instanceof ContactTypeModel) { return ContactTypeModel.Instantiate(o); }
    else if (model instanceof JobModel) { return JobModel.Instantiate(o); }
    else { throw new IllegalStateException("The Model is defined as something other than predefined!  The Model is defined as " + model.getClass().getName() + "."); }
}

希望这有助于一个可能偶然发现这一点的人。