【问题标题】:Getting Execute before finishing the task Android在完成任务 Android 之前获取执行
【发布时间】:2014-02-02 05:50:52
【问题描述】:

您好,我正在我的活动中运行 Asynctask 并从服务器获取数据。在onPostExecute metod 中,我正在将数据插入数据库中,现在我想在两个不同的片段中传递这些 id,我通过以下代码传递这些 id:

Bundle bundle = new Bundle();
    bundle.putStringArray(BConstant.TAXONOMY_TID, dbtids);
    bundle.putStringArray(BConstant.PRODUCT_CATEGORY_NAMES,
            dblistProCategory);
    ProductCategoryFragment.newInstance(bundle);

    // ProductDetailsFragment
    Bundle bundleForProductList = new Bundle();
    bundleForProductList
            .putStringArray(BConstant.TAXONOMY_TID, dbtids);
    bundleForProductList.putString(BConstant.WEB_SERVICES_COOKIES,
            cookie);
    bundleForProductList.putStringArray(
            BConstant.PRODUCT_CATEGORY_NAMES, dblistProCategory);
    ProductListFragment.newInstance(bundleForProductList);

但上面的代码行在 AsyncTask 完成之前执行。但我在这段代码上方写了这一行new CategoryFrag().execute();。我该怎么办。

已编辑

protected void onPostExecute(JSONArray result) {
        listItems = new ArrayList<String>();
        for (int i = 0; i < result.length(); i++) {
            try {
                listItems
                        .add(result.getJSONObject(i)
                                .getString(BConstant.NAME_CONSTANT)
                                .toString());
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
        listProCategory = listItems.toArray(new String[0]);
  returnsTID = saDatabaseHandler.getProductCategoryTID();
        for (int i = 0; i < tids.length; i++) {
            if (!returnsTID.contains(tids[i])) {
                saDatabaseHandler.insertProductCategoryData(
                        tids[i], listProCategory[i]);
                
            }
        }
        getOfflineData();
  }

LOGCAT:

    02-02 11:41:00.451: E/AndroidRuntime(20901): FATAL EXCEPTION: main
    02-02 11:41:00.451: E/AndroidRuntime(20901): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.abc.xyz/com.abc.xyz.ProductListActivity}: java.lang.NullPointerException
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2114)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2139)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.ActivityThread.access$700(ActivityThread.java:143)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1241)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.os.Handler.dispatchMessage(Handler.java:99)
    02-02 11 :41:00.451: E/AndroidRuntime(20901):   at android.os.Looper.loop(Looper.java:137)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.ActivityThread.main(ActivityThread.java:4960)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at java.lang.reflect.Method.invokeNative(Native Method)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at java.lang.reflect.Method.invoke(Method.java:511)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at dalvik.system.NativeStart.main(Native Method)
    02-02 11:41:00.451: E/AndroidRuntime(20901): Caused by: java.lang.NullPointerException
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at java.util.Arrays$ArrayList.<init>(Arrays.java:38)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at java.util.Arrays.asList(Arrays.java:154)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:141)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at com.abc.xyz.ProductCategoryFragment$DisplayProductCategoryListArrayAdapter.<init>(ProductCategoryFragment.java:175)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at com.abc.xyz.ProductCategoryFragment.onActivityCreated(ProductCategoryFragment.java:113)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:848)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1035)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1017)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1804)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.Activity.performCreate(Activity.java:5206)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2078)
    02-02 11:41:00.451: E/AndroidRuntime(20901):    ... 11 more

【问题讨论】:

  • 将所有代码移至onPostExecute
  • @Raghunandan 异常即将到来
  • @Raghunandan 让我通过分段调用上述代码来清除我传递 id 的问题。所以首先我想完成活动类的 AsyncTask 然后我只想启动片段类代码。
  • 这段代码在 onPost 里面?
  • @Amrola 不,但我也尝试过 onPostExecute。

标签: java android android-asynctask ui-thread


【解决方案1】:

从您的onPostExecute 方法调用您的活动中定义的方法。并在该方法中编写上述代码。

如果异步任务在另一个类中,则将上下文传递给异步任务,并在从数据库中获取数据后的onPostExecute 方法中,执行以下操作:

((YourCallingActivity)mContext).methodName();

【讨论】:

    猜你喜欢
    • 2014-10-28
    • 2018-02-28
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多