我有一个片段,用于从数据对象设置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();
}
}
这是正确的方法吗?有更好的方法吗?
答案 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);
}
}
}