- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个 Android 应用程序,它获取用户位置的坐标,然后使用这些坐标与以下提供的 REST API 进行通信: this website
我对 JSON 解析和 REST API 相当陌生。我已经按照 this tutorial 使用了 AsyncTask、Spring 和 Jackson。
我的MainActivity.java看起来像这样 -
package com.gamecodeschool.whereintheworld;
import android.content.Context;
import android.location.LocationListener;
import android.location.LocationManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.location.Criteria;
import android.location.Location;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import android.os.AsyncTask;
public class MainActivity extends AppCompatActivity implements LocationListener {
private TextView txtLat;
private TextView txtLong;
private TextView txtSource;
private LocationManager locationManager;
private String provider;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new HttpRequestTask().execute();
setContentView(R.layout.activity_main);
txtLat = (TextView) findViewById(R.id.txtLat);
txtLong = (TextView) findViewById(R.id.txtLong);
txtSource = (TextView) findViewById(R.id.txtSource);
//Initialize locationManager
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
provider = locationManager.getBestProvider(criteria, false);
Location location = locationManager.getLastKnownLocation(provider);
//initialize the location
if(location != null){
txtSource.setText("Source = " +provider);
onLocationChanged(location);
}
}
//start updates when app starts/resumes
@Override
protected void onResume() {
super.onResume();
new HttpRequestTask().execute();
locationManager.requestLocationUpdates
(provider, 500, 1, this);
}
@Override
protected void onPause() {
super.onPause();
locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {
double lat = location.getLatitude();
double lng = location.getLongitude();
txtLat.setText(String.valueOf(lat));
txtLong.setText(String.valueOf(lng));
txtSource.setText("Source = " + provider);
}
public String getCoordinates(Location location)
{
double latitude = location.getLatitude();
double longitude = location.getLongitude();
return ("lat="+latitude+"&lng="+longitude);
}
@Override
public void onStatusChanged(String provider,
int status, Bundle extras) {
txtSource.setText("Source = " + provider);
}
@Override
public void onProviderEnabled(String provider) {
txtSource.setText("Source = " + provider);
}
@Override
public void onProviderDisabled(String provider) {
txtSource.setText("Source = " + provider);
}
//USER DEFINED CLASS
private class HttpRequestTask extends AsyncTask<Void, Void, sunrisedata> {
@Override
protected sunrisedata doInBackground(Void... params) {
try {
final String url = "http://api.sunrise-sunset.org/json?";
RestTemplate restTemplate = new RestTemplate();
restTemplate.getMessageConverters().add(new MappingJackson2HttpMessageConverter());
sunrisedata greeting = restTemplate.getForObject(url, sunrisedata.class);
return greeting;
} catch (Exception e) {
Log.e("MainActivity", e.getMessage(), e);
}
return null;
}
@Override
protected void onPostExecute(sunrisedata greeting) {
TextView greetingIdText = (TextView) findViewById(R.id.txtSunrise);
greetingIdText.setText(greeting.getSunrise());
}
}
}
在MainActivity.java的这一部分
final String url = "http://api.sunrise-sunset.org/json?";
我想传递从这部分代码获得的坐标 -
public void onLocationChanged(Location location) {
double lat = location.getLatitude();
double lng = location.getLongitude();
txtLat.setText(String.valueOf(lat));
txtLong.setText(String.valueOf(lng));
txtSource.setText("Source = " + provider);
}
因为根据 REST API 文档,GET 请求 URL 应该采用这种格式 -
http://api.sunrise-sunset.org/json?lat=36.7201600&lng=-4.4203400
如何检索纬度和经度并将其附加到 HttpRequestTask 类方法中的 URL -
protected sunrisedata doInBackground(Void... params)
到目前为止,logcat 错误看起来像这样 -
04-03 01:56:35.231 13842-1925/com.gamecodeschool.whereintheworld E/MainActivity: Could not read JSON: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:126)
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:147)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:76)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:484)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237)
at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:111)
at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:99)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@1713350c).inputStream(); line: 1, column: 11]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1524)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:557)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3094)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2339)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:817)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:697)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3031)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2978)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:123)
... 13 more
04-03 01:56:35.232 13842-13842/com.gamecodeschool.whereintheworld D/AndroidRuntime: Shutting down VM
04-03 01:56:35.233 13842-13842/com.gamecodeschool.whereintheworld E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gamecodeschool.whereintheworld, PID: 13842
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.gamecodeschool.whereintheworld.sunrisedata.getSunrise()' on a null object reference
at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.onPostExecute(MainActivity.java:124)
at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.onPostExecute(MainActivity.java:99)
at android.os.AsyncTask.finish(AsyncTask.java:636)
at android.os.AsyncTask.access$500(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5294)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
04-03 01:56:36.027 13842-2035/com.gamecodeschool.whereintheworld E/MainActivity: Could not read JSON: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]; nested exception is com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:126)
at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:147)
at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:76)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:484)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:439)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237)
at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:111)
at com.gamecodeschool.whereintheworld.MainActivity$HttpRequestTask.doInBackground(MainActivity.java:99)
at android.os.AsyncTask$2.call(AsyncTask.java:292)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: com.fasterxml.jackson.core.JsonParseException: Unrecognized token 'Array': was expecting ('true', 'false' or 'null')
at [Source: buffer(com.android.okio.GzipSource@3969795b).inputStream(); line: 1, column: 11]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1524)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:557)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._reportInvalidToken(UTF8StreamJsonParser.java:3094)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2339)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:817)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:697)
at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3031)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2978)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2158)
at org.springframework.http.converter.json.MappingJackson2HttpMessageConverter.readInternal(MappingJackson2HttpMessageConverter.java:123)
... 13 more
据我所知,出现此错误是因为正确的 URL 以及纬度和经度未传递到网站。显然,该应用程序在手机上运行时也会崩溃。
我按照 spring 网站上的教程创建的另一个类是 - sunrisedata.java 用于存储获得的 JSON 响应,如下所示 -
package com.gamecodeschool.whereintheworld;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown=true)
public class sunrisedata {
private String results;
public String getSunrise(){
return this.results;
}
}
请告诉我如何正确地将 MainActivity 类中获得的纬度和经度值传递到 HttpRequestTask 类中的 url,我只想从 JSON 检索日出数据并忽略所有其他字段。
最佳答案
获取用户位置是异步发生的,这意味着您必须等到位置从 LocationManager 返回给您之后才能发出获取日出/日落数据的请求。
现在,您在 onResume()
中请求日出/子集数据,这是不正确的。当您在此处执行请求时,您可能还没有位置数据。
您似乎想要在 onLocationChanged()
中获取日出/日落数据。此方法将包含您需要添加到 URL 的位置信息。
关于java - 在 Android 中使用日出/日落 REST API。如何正确传递获取到的位置坐标的URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43173309/
这个问题已经有答案了: How to do case insensitive string comparison? (23 个回答) 已关闭 3 年前。 用户在我的输入栏中写入“足球”,然后执行第 6
啊,不习惯 javascript 中的字符串。 character_id= + id + correct= + correctOrIncorrect 这就是我需要制作成字符串的内容。如果您无法猜测字符
$(function() { var base_price = 0; CalculatePrice(); $(".math1").on('change', function(e) { Calc
我找不到任何文章回答问题:将Spinnaker部署到Spinnaker将管理的同一Kubernetes集群是否安全/正确?我主要是指生产,HA部署。 最佳答案 我认为Spinnaker和Kuberne
我正在使用MSVC在Windows上从源代码(官方源代码发布,而不是从仓库中)构建Qt5(Qt 5.15.0)。 我正在设置环境。变量,依赖项等,然后运行具有1600万个选项的configure,最后
我需要打印一个包含重复单词的数组。我的数组已经可以工作,但我不知道如何正确计算单词数。我已经知道,当我的索引计数器 (i) 为 49 时,并且当 (i) 想要计数到 50 时,我会收到错误,但我不知道
我正在遵循一个指南,该指南允许 Google map 屏幕根据屏幕尺寸禁用滚动。我唯一挣扎的部分是编写一个代码,当我手动调整屏幕大小时动态更改 True/False 值。 这是我按照说明操作的网站,但
我有一个类“FileButton”。它的目的是将文件链接到 JButton,FileButton 继承自 JButton。子类继承自此以使用链接到按钮的文件做有用的事情。 JingleCardButt
我的 friend 数组只返回一个数字而不是所有数字。 ($myfriends = 3) 应该是…… ($myfriends = 3 5 7 8 9 12). 如果我让它进入 while 循环……整个
这个问题在这里已经有了答案: Is there a workaround to make CSS classes with names that start with numbers valid?
我正在制作一个 JavaScript 函数,当调整窗口大小时,它会自动将 div 的大小调整为与窗口相同的宽度/高度。 该功能非常基本,但我注意到在调整窗口大小时出现明显的“绘制”滞后。在 JS fi
此问题的基本视觉效果可在 http://sevenx.de/demo/bootstrap-carousel/inc.carousel/tabbed-slider.html 获得。 - 如果你想看一看。
我明白,如果我想从函数返回一个字符串文字或一个数组,我应该将其声明为静态的,这样当被调用的函数被返回时,内容就不会“消亡”。 但我的问题是,当我在函数内部使用 malloc 分配内存时会怎样? 在下面
在 mySQL 数据库中存储 true/false/1/0 值最合适(读取数据消耗最少)的数据字段是什么? 我以前使用过一个字符长的 tinyint,但我不确定它是否是最佳解决方案? 谢谢! 最佳答案
我想一次读取并处理CSV文件第一行中的条目(例如打印)。我假设使用Unix风格的\n换行符,没有条目长度超过255个字符,并且(现在)在EOF之前有一个换行符。这意味着它是fgets()后跟strto
所以,我们都知道 -1 > 2u == true 的 C/C++ 有符号/无符号比较规则,并且我有一种情况,我想有效地实现“正确”比较。 我的问题是,考虑到人们熟悉的尽可能多的架构,哪种方法更有效。显
**摘要:**文章的标题看似自相矛盾。 本文分享自华为云社区《Java异常处理:如何写出“正确”但被编译器认为有语法错误的程序》,作者: Jerry Wang 。 文章的标题看似自相矛盾,然而我在“正
我有一个数据框,看起来像: dataDemo % mutate_each(funs(ifelse(. == '.', REF, as.character(.))), -POS) # POS REF
有人可以帮助我使用 VBScript 重新格式化/正确格式化带分隔符的文本文件吗? 我有一个文本文件 ^分界如下: AGREE^NAME^ADD1^ADD2^ADD3^ADD4^PCODE^BAL^A
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
我是一名优秀的程序员,十分优秀!