java - 错误:无法在 Android Java 的后台线程上调用 setValue
问题描述
此问题不包括 Livedata。我已经阅读了几个问题,但没有找到我的问题的答案,下面的文件给出了错误。从后台线程调用模拟更新()。问题在于在simulatedUpdate() 中调用的receivedLocationUpdate() 方法。我假设传递的参数以某种方式调用 set... 方法。我需要知道为什么会发生这种情况以及在当前情况下如何调用此方法。
public class LogDataSimulation {
SharedPreferences defaultPreferences = PreferenceManager.getDefaultSharedPreferences(MyApplication.getAppContext());
private static final String TAG = "LogDataSimulation";
public static boolean simulatedDataEnabled;
WMManager wmManager = new WMManager();
public LogDataSimulation() {
simulatedDataEnabled = defaultPreferences.getBoolean(kSimulationMode, false);
}
public synchronized void simulatedUpdate() {
InputStream logFileStream = null;
try {
AssetManager assetManager = MyApplication.getAppContext().getAssets();
logFileStream = assetManager.open("file.csv");
InputStreamReader streamReader = new InputStreamReader(logFileStream, Charset.defaultCharset());
CSVReader reader = new CSVReader(streamReader);
String[] nextLine;
double headingAccuracy = 0.0;
double strideAccuracy = 0.0;
double currentStepLength = 0.0;
int totalStepCount = 0;
double cumulativeDistance = 0.0;
double latitude = 0.0;
double longitude = 0.0;
double altitude = 0.0;
double userHeading = 0.0;
Location globalLocation = new Location("");
int floorID = 0;
double stepBias = 0.0;
double stepBiasAccuracy = 0.0;
double orientationBias = 0.0;
double orientationBiasAccuracy = 0.0;
TestUpdate update = new TestUpdate();
boolean header = true;
while ((nextLine = reader.readNext()) != null) {
if (nextLine[2].equalsIgnoreCase("data")) {
//Throw the header.
if (header) {
header = false;
continue;
}
headingAccuracy = Double.valueOf(nextLine[17]);
strideAccuracy = Double.valueOf(nextLine[22]);
currentStepLength = Double.valueOf(nextLine[24]);
totalStepCount = Integer.valueOf(nextLine[25]);
cumulativeDistance = Double.valueOf(nextLine[26]);
latitude = Double.valueOf(nextLine[30]);
longitude = Double.valueOf(nextLine[31]);
altitude = Double.valueOf(nextLine[32]);
userHeading = Double.valueOf(nextLine[36]);
globalLocation = update.globalParticlesLocation();
floorID = 10000;
stepBias = Double.valueOf(nextLine[39]);
stepBiasAccuracy = Double.valueOf(nextLine[41]);
orientationBias = Double.valueOf(nextLine[43]);
orientationBiasAccuracy = Double.valueOf(nextLine[46]);
Thread.sleep(1000);
}
wmManager.receivedUpdate(longitude, latitude,
altitude, totalStepCount, cumulativeDistance, currentStepLength,
strideAccuracy, userHeading, headingAccuracy, floorID,
globalLocation, stepBias, stepBiasAccuracy, orientationBias,
orientationBiasAccuracy);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
记录的错误是:我得到一个 W/System.err:在 com.app.navigationSimulation.LogDataSimulation.simulatedUpdate(LogDataSimulation.java:95) 第 95 行是对 wmManager.receivedUpdate() 的调用和异常消息:无法调用在后台线程上设置值
解决方案
推荐阅读
- android - 按钮不显示(左)图像
- jquery - 引导程序上的砌体网格
- java - 从python调用Java应用程序时无法读取文件
- android - java.lang.NoSuchMethodError: 没有虚拟方法加载(Ljava/lang/String;)Lcom/bumptech/glide/DrawableTypeRequest;
- java - Jython 错误:[错误] 无法构建终端;回退到不受支持
- java - Java随机化字符串
- javascript - 单击按钮时如何在另一个导航药丸中添加引导卡
- c++ - Omp for loop initialize vector
- mongodb - Mongoose 在使用 $facet 进行聚合时如何使用 populate()?
- c# - 如何在 MVC C# 中打开从数据库检索到特定页面的 PDF