提问人:Goodsir 23 提问时间:7/12/2023 更新时间:7/12/2023 访问量:54
我将变量传递给我的函数的方式是否正确?
Is the way Im passing variables to my function correct?
问:
我目前正在尝试将 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 文件在版本和版本兼容性方面可能不正确,但没关系。如果您需要查看负责更改活动的功能,请告诉我。在活动可以更改之前还有更多代码,但我不确定是代码的这一部分还是负责更改活动的函数是问题所在。 感谢您的帮助
答:
尝试删除回调中的调用,并查看文本是否出现在屏幕上。如果是这样,显然,您的代码在 UI 上运行,这是一个 cpu 密集型任务,应该在与 UI 线程不同的单独线程中运行。getTravelTime
getTravelTime
您可以尝试使用 AsyncTasks。覆盖回调后,它将确保在单独的线程中运行 cpu 密集型代码,并在完成后在 UI 中进行更改。我还没有赶上 Android 中的最新更改,但似乎 AsyncTasks 已被弃用,因此您可以直接使用 java 执行器。
评论
getTravelTime
Directionsmanager
评论