【问题标题】:Fragment looses variables in observer method片段在观察者方法中丢失变量
【发布时间】:2018-08-18 15:07:17
【问题描述】:

我创建了一个从 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);}

希望你能帮我解决我的问题。

【问题讨论】:

  • 您在 getStringRequest 方法中创建了一个新的片段实例。相反,您应该将现有的片段实例传递给该方法。

标签: android android-fragments nullpointerexception


【解决方案1】:

首先你不应该在你的 WebService 中这样做。

Daten daten = new UserFragment();

解决方案

1) 在 web 服务请求本身中传递回调监听器,这里是修改后的方法签名。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2021-09-16
    • 1970-01-01
    • 2018-04-18
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多