【问题标题】:Sending JSON object from activity to Fragment将 JSON 对象从活动发送到片段
【发布时间】:2014-10-08 15:01:09
【问题描述】:

大家好

我已经为此寻找了几个小时的答案。能否请你帮忙。这真的很重要。

所以我要做的是在 Login 活动的 Asynctask 中获取一个 JSON 对象,然后将该对象发送到我将解析它的 Fragment。

这是登录活动的 Asynctask,我尝试在其中发送 JSON(我从 postrequest() 重新运行):

@Override
    protected Void doInBackground(Void... params)
    {
        String JSON = null;
        try
        {

        JSON = new String(postrequest());

        Bundle bundle = new Bundle();
        bundle.putString("jString", JSON);
        Timetable fragobj = new Timetable();
        fragobj.setArguments(bundle);

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }

    }

这是我尝试在 onCreatView 中获取 JSON 的片段 (Timetable.class)

String jsonString = getArguments().getString("jString");
JSONObject jsonObject = new JSONObject(jsonString);

我的问题是,当我尝试使用 getArguments 获取 jsonString 时,总是得到 NullPointerException。

任何帮助将不胜感激。
干杯

附言希望我的帖子不要太乱XD

【问题讨论】:

  • 您是在 AsyncTask 完成之前还是之后添加片段?我的猜测是您在完成之前添加了 Fragment,因此在 doInBackground() 完成之前调用了 onCreateView()
  • postrequest 是否在与 doInBackground 不同的线程上运行?在这种情况下,您可能会在数据可用之前创建片段
  • 崩溃日志说它是String jsonString = getArguments().getString("jString");的NullPointer
  • 异步完成后,应用程序切换到另一个 Activity,在其中创建 Fragments @Override protected void onPostExecute(Void result) { Intent switcher = new Intent(Login.this, MainActivity.class); Login.this.startActivity(switcher); }
  • 您应该在 onPostExecute 中创建片段

标签: java android json android-fragments android-asynctask


【解决方案1】:

与其将变量从 AsyncTask 传递给 Fragment,不如使用一个接口,然后将其传回......

在您的 AsyncTask 中执行以下操作:

 public interface WebServiceResult {
     void OnWebService(int type, String result);
 }

我就是这样设置它的,这样我就可以将同一个 Web 服务用于多个不同的调用。

在您的 AsyncTask 中,创建一个构造函数并让它声明接口:

WebServiceResult listener;
public WebService(Context c, WebServiceResult listener, JSONObject jObject,
        int typeofCall) {
    this.c = c;
    this.typeofCall = typeofCall;
    this.listener = listener;
    this.jObject = jObject;
}

来自我自己的应用程序的代码。

然后在调用完成后,将您的 json 从 doInBackground 传递到您的 onPostExecute

if (result != null) {
    if (listener != null)
        listener.OnWebService(typeofCall, result);
} else {
    //Do Else Statement
}

这会将变量传递回您的活动,您可以使用 getArguments 将其发送到片段。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多