【问题标题】:How can I get an order id from Firestore and pass it to my adaptor class?如何从 Firestore 获取订单 ID 并将其传递给我的适配器类?
【发布时间】:2021-07-17 14:28:07
【问题描述】:

我需要从 Firestore 获取订单 ID 并将该 ID 传递给我的查询,但我得到的订单 ID 是异步发生的。所以我不得不在 Firebase 回调方法中初始化我的适配器。问题是我的 onStart 和 onStop 方法正在监听适配器,然后抛出 NullPointException。

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_to_cart);

        // Navigate to men section
        fromAddToCartToForHim = findViewById(R.id.fromAddToCartToForHim);
        fromAddToCartToForHim.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(AddToCart.this, HimActivity.class);
                startActivity(intent);
                finish();
            }
        });


        //Navigate to Women section
        fromAddToCartToForHer = findViewById(R.id.fromAddToCartToForHer);
        fromAddToCartToForHer.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(AddToCart.this, WomenActivity.class);
                startActivity(intent);
                finish();
            }
        });


        // Navigate to Household section

        fromAddToCartToForHouseHold = findViewById(R.id.fromAddToCartToForHouseHold);
        fromAddToCartToForHouseHold.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(AddToCart.this, HouseHoldActivity.class);
                startActivity(intent);
                finish();
            }
        });


        // SetUpRecyclerView func

        setUpRecycleView();


    }


private void setUpRecycleView() {


        // GET CURRENT ORDER ID

        orderRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull @NotNull Task<QuerySnapshot> task) {
                if (task.isComplete()) {

                    QuerySnapshot snapshot = task.getResult();

                    assert snapshot != null;
                    for (DocumentSnapshot snapshots : snapshot.getDocuments()) {

                        String user_id = snapshots.getString("user_id");
                        Boolean status = snapshots.getBoolean("status");

                        if (user_id.equals(getUserId()) && !status) {

                            // User has existing Order
                            // Check if order is pending or completed

                            String orderId = snapshots.getId();

                            Query query = orderRef
                                    .document(orderId)
                                    .collection("orderlist")
                                    .orderBy("category").orderBy("priority", Query.Direction.ASCENDING);

                            FirestoreRecyclerOptions<OrderList> options = new FirestoreRecyclerOptions.Builder<OrderList>()
                                    .setQuery(query, OrderList.class)
                                    .build();


                            addToCartAdaptor = new AddToCartAdaptor(options);

                            recyclerView = findViewById(R.id.recyclerviewAddToCart);
                            recyclerView.setHasFixedSize(true);
                            recyclerView.setLayoutManager(new LinearLayoutManager(AddToCart.this));
                            recyclerView.setAdapter(addToCartAdaptor);
                        }
                    }
                }


            }
        });
    }



enter code here

 @Override
    protected void onStart() {
        super.onStart();
        addToCartAdaptor.startListening(); Error happens here
    }

    @Override
    protected void onStop() {   `enter code here`
        super.onStop();

        addToCartAdaptor.stopListening();
    }

这是我得到的错误

W/example.neptun: Accessing hidden method Lcom/msic/qarth/PatchStore;->createDisableExceptionQarthFile(Ljava/lang/Throwable;)Z (blacklist, JNI)
E/example.neptun: [qarth_debug:]  get PatchStore::createDisableExceptionQarthFile method fail.
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.neptune, PID: 2884
    java.lang.NullPointerException: Attempt to invoke virtual method 'void com.example.neptune.Adapters.AddToCartAdaptor.startListening()' on a null object reference
        at com.example.neptune.AddToCart.onStart(AddToCart.java:150)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1419)
        at android.app.Activity.performStart(Activity.java:7479)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3454)
        at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:180)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:165)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:142)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:70)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2199)
        at android.os.Handler.dispatchMessage(Handler.java:112)
        at android.os.Looper.loop(Looper.java:216)
        at android.app.ActivityThread.main(ActivityThread.java:7625)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)
I/Process: Sending signal. PID: 2884 SIG: 9

【问题讨论】:

  • 如果应用程序崩溃,会有一个堆栈跟踪。请在 logcat 上查找,并将其添加到您的问题中。除此之外,还请指出发生错误的确切行。
  • 我得到的错误指向我有 addToCartAdaptor.startListening() 的 onStart 函数
  • 请编辑您的问题并向我们展示您在代码中的哪个位置调用 setUpRecycleView()。
  • 我正在从 onCreate 方法调用 setUpRecyclerView

标签: java firebase asynchronous google-cloud-firestore nullpointerexception


【解决方案1】:

当您使用以下代码行时:

addToCartAdaptor = new AddToCartAdaptor(options);

在“onComplete()”方法中,这意味着它将始终在 onStart 之后立即运行,因为从 orderRef 引用中获取数据需要一些时间。您可以做的是在 onComplete() 方法之外创建(默认)Query、FirestoreRecyclerOptions 和 AddToCartAdaptor 对象,一旦您在回调中获得数据,只需使用您获得的数据更新“选项”对象从数据库。这样,您仅在可用时才将数据提供给“选项”对象。

这也意味着您将永远不会再收到 NullPointerException,因为 addToCartAdaptor 已经初始化。

【讨论】:

  • 这解决了适配器的空指针问题,但是,Query、FirestoreRecyclerOptions 和 AddToCartAdaptor 之间存在关系,因为 Query.document(?) 需要一个来自onComplete 方法。由于这是异步的,我不能在方法之外使用该数据
  • 这就是我所说的。第一次传递一个查询的默认实例来实例化“选项”对象,一旦你从数据库中获取数据,创建一个新的查询对象,包含(orderId),然后将该查询传递给“ options" 对象使用 updateOptions() 方法,如this,对吧?
  • 嗨,Alex 使用您的上述建议,谢谢。但是,仍然存在问题。一旦我最小化应用程序并再次最大化它,recyclerview 只会显示来自 firestore 的项目。
  • 很高兴听到它有效。嗯,你得到这种行为的原因可能有很多,但是如果没有看到代码,我就帮不上什么忙了。因此,请使用自己的MCVE 发布一个新问题,以便我和其他 Firebase 开发人员可以帮助您。
猜你喜欢
  • 2018-06-21
  • 2016-02-16
  • 2020-07-01
  • 2020-03-14
  • 2016-04-05
  • 2019-03-06
  • 1970-01-01
  • 2016-09-08
  • 2019-05-24
相关资源
最近更新 更多