我在为RssReader运行我的Android项目时遇到错误.
码:
URL url = new URL(urlToRssFeed);
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
XMLReader xmlreader = parser.getXMLReader();
RssHandler theRSSHandler = new RssHandler();
xmlreader.setContentHandler(theRSSHandler);
InputSource is = new InputSource(url.openStream());
xmlreader.parse(is);
return theRSSHandler.getFeed();
Run Code Online (Sandbox Code Playgroud)
它显示以下错误:
android.os.NetworkOnMainThreadException
Run Code Online (Sandbox Code Playgroud)
我该如何解决这个问题?
关于在我的项目中使用Volley,我几乎没有问题:
使用OkHttp我们可以发出HTTP请求然后从服务器获得响应
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url(url)
.build();
Response response = client.newCall(request).execute();
Run Code Online (Sandbox Code Playgroud)
然后用Gson lib将响应转换为我们需要的对象.
这是来自Square/OkHttp doc:
它的请求/响应API设计具有流畅的构建器和不变性.它支持同步阻塞调用和带回调的异步调用
我从stackOverFlow中读取
如果可用,Retrofit会自动使用OkHTTP
.
所以我的问题是究竟是什么改造?
什么改造可以做到OkHttp不能?!
我认为OkHttp和Gson解决了请求API问题,那么Retrofit为我们解决了什么问题?
我看到关于Volley的Google IO 2013会议,我正在考虑转向凌空.Volley是否支持添加POST/GET参数来请求?如果是,我该怎么办?
我正在使用高效的网络库改造,但是我无法处理包含单个前缀的Dynamic JSON, responseMessage
后者object
随机responseMessage
变化,在某些情况下(动态),相同的prefix()会更改为String.
Json格式responseMessage的对象:
{
"applicationType":"1",
"responseMessage":{
"surname":"Jhon",
"forename":" taylor",
"dob":"17081990",
"refNo":"3394909238490F",
"result":"Received"
}
}
Run Code Online (Sandbox Code Playgroud)
responseMessage
Json格式动态更改为类型字符串:
{
"applicationType":"4",
"responseMessage":"Success"
}
Run Code Online (Sandbox Code Playgroud)
对我来说问题是因为改造有内置的JSON
解析我们必须为每个请求分配单个POJO!但遗憾的是,REST-API是使用动态JSON
响应构建的,前缀将在成功(...)和失败(...)方法中随机更改为字符串到对象!
void doTrackRef(Map<String, String> paramsref2) {
RestAdapter restAdapter = new RestAdapter.Builder().setEndpoint("http://192.168.100.44/RestDemo").build();
TrackerRefRequest userref = restAdapter.create(TrackerRefRequest.class);
userref.login(paramsref2,
new Callback<TrackerRefResponse>() {
@Override
public void success(
TrackerRefResponse trackdetailresponse,
Response response) {
Toast.makeText(TrackerActivity.this, "Success",
Toast.LENGTH_SHORT).show();
}
@Override
public void failure(RetrofitError retrofitError) {
Toast.makeText(TrackerActivity.this, "No internet",
Toast.LENGTH_SHORT).show();
}
});
}
Run Code Online (Sandbox Code Playgroud)
POJO: …
我稍微感到困惑之间的差异Asynctask
,Thread
,Service
,Loader
在Android系统.
我知道它是如何工作的.但我仍然不明白我应该使用什么以及何时使用.
我使用Android工作了3年,并且通常仍然AsyncTask
用于所有后台任务(有时候用于Thread).但是很多人说"Asynctask已经过时了",不建议使用它们.他们还建议使用robospice或Volley.
那么,AsyncTask
真的很糟糕,我应该使用框架进行网络任务?我应该将什么用于后台(而不是网络)任务?
我正在寻找一个开源图像加载/缓存解决方案.
我期待:
我希望能够处理来自磁盘和网络的异步图像加载,但是我不确定Google的排球是否从磁盘加载.
Volley是否允许从磁盘加载资源?
所以我Google Volley
用于HTTP请求,基本上使用Java
的是HttpURLConnection
.
根据我的测试,问题是:
当达到'读'超时时HttpURLConnection
,在连接关闭之前执行静默重试并抛出相关的异常(SocketTimeoutException
).
请注意:
- 我在使用HTTP POST
请求时注意到此错误.
- 'read'超时与'connect'超时不同.
- 如果未设置'read'超时(通过调用connection.setReadTimeout(int)
设置)(0),或设置为大于该值connection.setConnectTimeout(int)
,则不会发生此错误.
- 这个问题已经在这里讨论了,但是我没有找到任何令人满意的解决方案.
- 这里可以找到一个有点相关的问题,但我不确定它是否相关(是吗?)
更多背景
我的应用程序用于付钱,所以不重试请求是至关重要的(是的,我知道它可以由服务器处理,我希望我的客户端"正确"无论如何).
设置'read'超时时,如果服务器连接已建立,但服务器在应答之前等待/ sleeps/delays-response'超时'时间(从而引发'read'异常,而不是'connect'异常) ,在引发异常之前发送另一个(静默)请求,导致2个类似的请求,这是不可接受的.
我在找什么样的解决方案?
好吧,一个能很好地解决这个问题/错误的问题,就像这里解释的解决方案一样(但我再说一遍,我认为在这种情况下它是无关紧要的).
此外,我希望保持原始流程不变,这意味着不要强制连接关闭或类似的东西.
我现在要做的是,将'read'超时设置为'connection'超时的两倍(它们同时开始计数),以确保首先引发'connection'异常.我还将尝试在服务器端克服此问题.问题是,这个"读取"超时是有原因的,我当前的实现实际上只是忽略它,并且只处理"连接"超时.
编辑
该Volley
图书馆的RetryPolicy
还没有在这个问题上的影响,因为这是一个静默重试.我在图书馆里看起来尽可能深.到处记录/断点,取消了重试的调用.我怎么知道它是99.99%的HttpURLConnection
问题.
我目前编码和解码图像到Base64.我通过使用流将图像编码为字符串来克服OOM的初始问题.
我现在的问题是我无法理解如何通过Gson将多个分辨率图像(5620 x 3747 - 4.92MB或3264 x 1836 - 1.35MB)的多个Base64编码字符串添加到JSON对象.目前Gson仅使用来自5312 x 2988 - 4.95 MB映像的2个Base64字符串抛出OOM异常.
我知道android可能只能为每个应用程序节省16/20Mb,因此这种转换必须超过限制.
如何将流中的Base64字符串写入JSON对象,该对象将包含发布到我的服务器所需的特定值?
是否更容易更改我的服务器以接受多部件请求而不是基于JSON的POJO与多个Base64字符串?我目前使用的是Volley,并没有官方的多部分请求以及IO流.
如果是压缩问题,在编码到Base64字符串之前,我应该对图像应用多少压缩?理想情况下,我希望失去任何质量但具有最佳压缩级别.
更多信息
我正在上传多个不同分辨率的图像,因为它是兼容性的测试.例如,我发送的所有图像都是在低分辨率和极高分辨率的设备上拍摄的,因为我的应用依赖于这些图像的功能.我试图证明我的应用程序可以处理任何图像(在某种程度上,主要是在移动设备上捕获的图像).
我知道有些图像可能太大,以至于将它们加载到内存中会导致异常.这是我稍后会尝试处理的.
在某些情况下,将上传的图像可以从1到200.
我正在努力寻找能够很好地扩展的最佳解决方案.
我正在研究这两个Android Http Networking库.
我想有些人使用这两个库的经验.就个人而言,我总是非常高兴地使用http://loopj.com/android-async-http/库.但最近我建议使用Volley Framework.
我可以从一个到另一个获得什么好处?
从我的阅读到目前为止,Volley在一个库中集成了许多不错的功能,如图像加载,请求缓存,请求取消.
我目前的使用案例/规格:
从我的Android应用程序中获取Web服务.
从SE上的一些阅读:
"Volley一切都很好,但从负面来看,它是一个没有文档记录,不受支持的,"将代码扔到墙上并对其进行I | O演示"库".
所以我认为它清晰的Volley可能会得到功能,但是记录和维护的程度如何呢?如果我决定使用它,4年后仍然会有它的支持吗?