android - 片段在观察者方法中丢失变量
问题描述
我创建了一个从 Web 服务获取数据的片段。当我从我的 Web 服务获取数据时,我通知片段更新数据。我的数据对 Fragment 是正确的,但是我的 Fragment 丢失了我之前初始化的所有变量和控件,并且在设置 TextView 文本时出现 NullPointerException。
片段类:
public class UserFragment extends Fragment implements Daten {
private String username, streamingService;
public TextView usernameTv, currentTv;
private ImageView serviceIv;
public UserFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_user, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
findViews(view);
//GetRequest.getRequest(getContext(), LinkHandler.databaseGetFriend, LinkHandler.paramHelper("username", "name"));
GetRequest.getStringRequest(getContext(), LinkHandler.databaseGetFriend, LinkHandler.paramHelper("username", "name"));
}
@Override
public void erhalteFreunde(String Abbo) {
}
@Override
public void erhalteUser(JSONObject user){
try {
JSONArray userData = UserData.getInstance().getFetchedData().getJSONArray("message");
username = userData.getJSONObject(0).getString("username");
streamingService = userData.getJSONObject(0).getString("streamingservice");
usernameTv.setText(username);
currentTv.setText(userData.getJSONObject(0).getString("latestsong"));
} catch (JSONException e) {
e.printStackTrace();
}
}
private void findViews(View view){
usernameTv = (TextView) view.findViewById(R.id.usernameTvUser);
currentTv = (TextView) view.findViewById(R.id.currentTvUser);
serviceIv = (ImageView) view.findViewById(R.id.serviceIvUser);
}}
我的网络请求:
public static void getStringRequest(final Context context, String url, final Map<String, String> parameter) {
RequestQueue queue = Volley.newRequestQueue(context);
StringRequest strRequest = new StringRequest(Request.Method.POST, url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Daten daten = new UserFragment();
try {
daten.erhalteUser(Helper.convertStringToJson(response));
} catch (JSONException e) {
e.printStackTrace();
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(context, error.toString(), Toast.LENGTH_SHORT).show();
}
}) {
@Override
protected Map<String, String> getParams() {
return parameter;
}
};
queue.add(strRequest);
}}
我的界面:
public interface Daten {
void erhalteFreunde(String Abbo);
void erhalteUser(JSONObject user);}
我希望你能帮助我解决我的问题。
解决方案
首先,您不应该在您的 WebService 中执行此操作。
Daten daten = new UserFragment();
解决方案
1)在webservice请求本身中传递回调监听器,这里是修改后的方法签名。
public static void getStringRequest(final Context context, String url, final Map<String, String> parameter, Daten daten )
2)然后调用会变成这样。
GetRequest.getStringRequest(getContext(), LinkHandler.databaseGetFriend, LinkHandler.paramHelper("username", "name"),this);
推荐阅读
- xml - XSL 节点集:不按名称查找子元素
- java - 如何使用 ArrayAdapter 将获取的 json 数据显示到 listView 中
- java - 使用 Spring-Retry 的 Kotlin 未调用 @Recover
- git - git 结帐 -b
但不在 git log 中显示历史记录 - angular - Angular 5 中的动态组件和事件发射器
- svg - SVG 文件具有相同的宽度且没有视图框,但两者看起来大小不同
- angular - nrwl 在库之间创建共享模块
- html - 使用 ion-slide 时页面不会滑到下一页
- c# - Wix ServiceInstall 指定帐户
- asp.net-core - 没有正则表达式的 ASP.NET Core 2.1 中的 URL 重写