我的方法是以正确的方式从排球响应“Android方式”更新textview吗?

时间:2017-02-07 03:41:39

标签: java android android-volley

我有一个片段,用于从数据对象设置textViews。创建片段时,此数据对象最初为null,但在网络请求后更新。现在更新文本视图我创建了一个函数'updateAll'并将片段传递给处理网络响应的回调函数。一旦数据设置为数据对象,我就从片段引用中调用'updateAll'。

示例:

class someFragment extends Fragment {
    private Textview foo;
    private dataObject obj;

    ...
    public onCreate(...) {
       this.obj = new dataObject();
       sendRequestToVolley(..., new VolleyCallbacks(this));
    }
    public onCreateView(...) {
       ...
       foo.setText(obj.someVar);
    }

    public void updateAll() {
        foo.setText(obj.someVar);
    }
}


class VolleyCallbacks implements someInterface {

    public VolleyCallbacks(someFragmment fragment, dataObject obj) {

     this.obj = obj;
     this.fragment = fragment;
    }

     public onSuccess(Response r) {
        obj.updateData(r);
        this.fragment.updateAll();
     }
}

这是正确的方法吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

你的代码主要看起来很好。我看到一个问题:你将Fragment作为一个强有力的参考。如果在网络调用完成之前片段被销毁(即用户按下),它可能会产生内存泄漏。为防止这种情况,您应该使用WeakReference。

我也不会修改回调类中的数据对象。最好让片段修改它,因为他是持有它的引用。

我会改变你的代码:

public class SomeFragment extends Fragment {
    private Textview foo;
    private dataObject obj;

    ...
    public onCreate(...) {
        this.obj = new dataObject();
        sendRequestToVolley(..., new VolleyCallbacks(this));
    }
    public onCreateView(...) {
        ...
        refreshTextView();
    }

    private void refreshTextView() {
        foo.setText(obj.someVar);
    }

    void onRequestSuccess(Response r) {
        obj.updateData(r);
        refreshTextView();
    }
}


class VolleyCallbacks implements SomeInterface {

    private WeakReference<SomeFragment> fragmentWeak;

    public VolleyCallbacks(SomeFragment fragment) {
        this.fragmentWeak = new WeakReference<>(fragment);
    }

    public onSuccess(Response r) {
        SomeFragment fragment = this.fragmentWeak.get();

        if (fragment != null) {
            fragment.onRequestSuccess(r);
        }
    }
}