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

Posted

技术标签:

【中文标题】在 Asynctask 的 onPostExecute() 方法中更改片段【英文标题】:Making changes to fragment in Asynctask's onPostExecute() method 【发布时间】:2016-08-31 02:53:28 【问题描述】:

我正在尝试隐藏进度条并在来自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();
        
    

【问题讨论】:

你可以发布 logcat 吗? 感谢您的回复...我会立即发布...请等待 1 分钟 我收到此错误:java.lang.IllegalStateException: Fragment SellerRegisterFragment1b16e429 未附加到活动 致命异常:主进程:comb.example.shahid.carrottechapp,PID:4652 java.lang.IllegalStateException:片段 SellerRegisterFragment1b16e429 未附加到 android.support.v4.app.Fragment 的 Activity .getResources(Fragment.java:639) 在comb.example.shahid.carrottechapp.SellerRegisterFragment.showProgress(SellerRegisterFragment.java:182) 在comb.example.shahid.carrottechapp.SignupActivity.onPostExecute(SignupActivity.java:89) 在comb。 example.shahid.carrottechapp.SignupActivity.onPostExecute(SignupActivity.java:21) sr.editText.setError("重复网站");什么是sr? 【参考方案1】:

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

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

如果你在没有将 Fragment 添加到 Activity 的情况下使用这些变量,你会得到 NullPointerException。

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

【讨论】:

是的,片段已经被添加到活动中。当用户点击注册按钮时,异步任务完成它的工作,即它验证服务器上的用户,直到执行 onPostExecute() 方法,一个进度条显示在片段上...我想隐藏片段上的进度条并在已添加到活动中的片段上设置错误消息 我的问题基本上是..如何从 asynctask 的 onPostExecute() 方法更改片段 ui 元素,如 textview、编辑文本等。 好的。通过 AsyncTask 的构造函数将片段实例传递给 AsyncTask。将实例保存在 AsyncTask 中。在 onPostExecute 中使用该实例,而不是创建新实例。 你能写一个伪代码或演示代码吗! 当然。新的 MyAsyncTask(this).execute();这是片段实例。【参考方案2】:

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

Fragment SellerRegisterFragment1b16e429 not attached to Activity

问题是您试图在 SellerRegisterFragment 附加到 Activity 之前调用该方法。

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

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

SellerRegisterFragment sr = new SellerRegisterFragment();

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

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

【讨论】:

以上是关于在 Asynctask 的 onPostExecute() 方法中更改片段的主要内容,如果未能解决你的问题,请参考以下文章

如何在修改之前在 AsyncTask 中使用变量?

AsyncTask

Android AsyncTask get()形成另一个AsyncTask()

Android面试Android异步任务AsyncTask

AsyncTask 替代背景图像下载? (AsyncTask ---------已弃用)

在服务中使用 AsyncTask