我将变量传递给我的函数的方式是否正确?

Is the way Im passing variables to my function correct?

提问人:Goodsir 23 提问时间:7/12/2023 更新时间:7/12/2023 访问量:54

问:

我目前正在尝试将 2 个存储的字符串从数据库传递到我的 Directionsmanager 类中的函数 gettraveltime。 一旦一切运行,它应该将一个活动从当前活动更改为只有一个文本的活动。但是目前,当我按下按钮时,没有任何反应,在 logcat 文件中,唯一与获取地图数据有关的是这 3 个日志条目。

2023-07-11 22:25:21.896 24459-24505 DynamiteModule com.example.startuptest1 W 找不到 com.google.android.gms.providerinstaller.dynamite 的本地模块描述符类。 2023-07-11 22:25:21.995 24459-24505 DynamiteModule com.example.startuptest1 I 考虑本地模块 com.google.android.gms.providerinstaller.dynamite:0 和远程模块 com.google.android.gms.providerinstaller.dynamite:0 2023-07-11 22:25:21.998 24459-24505 ProviderInstaller com.example.startuptest1 W 无法加载 providerinstaller 模块:找不到可接受的模块 com.google.android.gms.providerinstaller.dynamite。本地版本为 0,远程版本为 0。

confirm.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                txt.setText("button pressed");
                Directionsmanager dm = new Directionsmanager();
                dm.getTravelTime(startLocation, endLocation, dbdisplay.this);
            }
        });

这就是我如何将变量传递给我的函数以获取 2 个保存位置之间的旅行时间。这是 Directionsmanager 类,以防您需要查看它。

package com.example.startuptest1;

import android.content.Context;
import android.widget.TextView;
import android.widget.Toast;

import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;

import com.google.android.gms.tasks.OnSuccessListener;
import com.google.firebase.functions.FirebaseFunctions;
import com.google.firebase.functions.HttpsCallableResult;

public class Directionsmanager {

    private FirebaseFunctions mFunctions;
    public Directionsmanager() {
        mFunctions = FirebaseFunctions.getInstance();
    }
    public void getTravelTime(String startLocation, String endLocation, final OnTravelTimeListener listener) {

        Calendar calendar = Calendar.getInstance();
        int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);


        if (dayOfWeek >= Calendar.MONDAY && dayOfWeek <= Calendar.FRIDAY) {

            Map<String, Object> data = new HashMap<>();
            data.put("startLocation", startLocation);
            data.put("endLocation", endLocation);
            data.put("mode", "transit");


            calendar.set(Calendar.HOUR_OF_DAY, 9);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);


            if (calendar.getTimeInMillis() < System.currentTimeMillis()) {
                calendar.add(Calendar.DAY_OF_MONTH, 1);
            }


            data.put("arriveByTime", calendar.getTimeInMillis());


            mFunctions.getHttpsCallable("getTravelTime")
                    .call(data)
                    .addOnSuccessListener(new OnSuccessListener<HttpsCallableResult>() {
                        @Override
                        public void onSuccess(HttpsCallableResult httpsCallableResult) {
                            // Handle the result
                            String travelTime = (String) httpsCallableResult.getData();
                            listener.onTravelTimeReceived(travelTime);
                        }
                    });
        } else {

            listener.onTravelTimeReceived("No action on weekends");

        }
    }

    public interface OnTravelTimeListener {
        void onTravelTimeReceived(String travelTime);
    }
}

我预计一旦我按下确认按钮,它就会将数据库值传递给方向管理器,一旦运行并返回一个值,它将更改为不同的活动。目前:起初我认为 gridle 文件在版本和版本兼容性方面可能不正确,但没关系。如果您需要查看负责更改活动的功能,请告诉我。在活动可以更改之前还有更多代码,但我不确定是代码的这一部分还是负责更改活动的函数是问题所在。 感谢您的帮助

Java Android 数据库 参数传递

评论


答:

0赞 Turkhan Badalov 7/12/2023 #1

尝试删除回调中的调用,并查看文本是否出现在屏幕上。如果是这样,显然,您的代码在 UI 上运行,这是一个 cpu 密集型任务,应该在与 UI 线程不同的单独线程中运行。getTravelTimegetTravelTime

您可以尝试使用 AsyncTasks。覆盖回调后,它将确保在单独的线程中运行 cpu 密集型代码,并在完成后在 UI 中进行更改。我还没有赶上 Android 中的最新更改,但似乎 AsyncTasks 已被弃用,因此您可以直接使用 java 执行器。

评论

0赞 Goodsir 23 7/12/2023
感谢您的回复,如果我误解了什么,请道歉。目前,我的 with in 正在一个没有 UI 元素的单独类中调用。再次对不起,这是我的第一个 android 应用程序项目,我边走边学。getTravelTimeDirectionsmanager
0赞 Turkhan Badalov 7/12/2023
即使您使用的是单独的类,代码仍在同一线程中运行。我建议你熟悉线程的概念,然后尝试使用 AsyncTasks