在Asynctask的onPostExecute()方法中更改片段

时间:2016-05-05 10:45:56

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

我正在尝试隐藏进度条并在onPostExecute()的片段中的编辑文本上设置错误消息,但我的应用仍然崩溃。我需要一些关于如何正确执行此操作的帮助。我将对此项目的片段进行大量更新,因此我需要知道从OnPostExecute()方法更新片段的正确方法。

我尝试创建Fragment类的对象,然后使用我尝试访问EditText的对象和名为showProgress()的progressBar方法但我得到运行时错误。

  protected void onPostExecute(String result) {
        super.onPostExecute(result);
        String jsonStr = result;
        SellerRegisterFragment sr = new SellerRegisterFragment();
        Toast toast = null;
        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);
                String query_result = jsonObj.getString("query_result");
                if (query_result.equals("SUCCESS")) {
                    toast = null;
                    Toast.makeText(context, "Registered successfully. You can now Login", Toast.LENGTH_SHORT).show();
                    if (toast == null || toast.getView().getWindowVisibility() != View.VISIBLE) {
                    context.startActivity(new Intent(context, SellerLoginOrRegisterActivity.class));
                }
                }
                else if (query_result.equals("DUPLICATE")) {
                    toast = null;
                    Toast.makeText(context, "Account for the given URL already exists", Toast.LENGTH_SHORT).show();
                    sr.showProgress(false);
                }
                else if (query_result.equals("FAILURE")) {
                    Toast.makeText(context, "Data could not be inserted. Signup failed.", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(context, "Couldn't connect to remote database.", Toast.LENGTH_SHORT).show();
                }
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(context, "Error parsing JSON data."+"...... "+ jsonStr, Toast.LENGTH_SHORT).show();
            }
        } else {
            Toast.makeText(context, "Couldn't get any JSON data.", Toast.LENGTH_SHORT).show();
        }
    }

2 个答案:

答案 0 :(得分:2)

您正在onPostExecute中创建Fragment实例。然后使用Fragment的成员变量。只是创建Fragment的实例不会做任何事情。

您必须将片段添加到活动中。只有这样才能执行Fragment的回调。在那些回调中(如onCreate,onCreateView),您将创建EditText,ProgressBar的实例。

如果您在不将片段添加到活动的情况下使用这些变量,您将获得NullPointerException。

我猜是,你已经在活动中添加了一个片段。您正在创建一个新实例,并在onPostExecute中使用该实例,而不是使用该Fragment实例。

答案 1 :(得分:0)

您的错误日志清楚地说明了问题。

Fragment SellerRegisterFragment{1b16e429} not attached to Activity

问题是您在将SellerRegisterFragment附加到活动之前尝试调用该方法。

FragmentS与活动相关联,您可以在Android文档here中找到说明。

我对以下LOC中的逻辑有疑问

SellerRegisterFragment sr = new SellerRegisterFragment();

您想在SellerRegisterFragment的现有实例上调用方法吗?如果是这样,那么您可以轻松使用broadcast

如果没有,那么您需要创建一个新实例,然后使用FragmentManager执行transaction,然后commit执行transaction