我已经调查了这个问题好几个月了,想出了不同的解决方案,我不满意,因为它们都是大规模的黑客攻击.我仍然无法相信一个设计有缺陷的课程已经进入框架而没有人在讨论它,所以我想我一定要错过一些东西.
问题在于AsyncTask
.根据它的文件
"允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序."
然后该示例继续示出如何showDialog()
调用一些示例性方法onPostExecute()
.然而,这对我来说似乎完全是设计的,因为显示一个对话框总是需要引用一个有效的Context
,而AsyncTask 绝不能保持对上下文对象的强引用.
原因很明显:如果活动被破坏而触发任务怎么办?这可能一直发生,例如因为你翻转了屏幕.如果任务将持有对创建它的上下文的引用,那么您不仅要继续使用无用的上下文对象(窗口将被销毁,并且任何 UI交互都会因异常而失败!),您甚至可能会创建一个内存泄漏.
除非我的逻辑在这里有缺陷,否则转换为:onPostExecute()
完全没用,因为如果你没有访问任何上下文,这个方法在UI线程上运行有什么用?你不能在这里做任何有意义的事情.
一种解决方法是不将上下文实例传递给AsyncTask,而是传递给Handler
实例.这是有效的:因为Handler松散地绑定了上下文和任务,所以你可以在它们之间交换消息而不会有泄漏的风险(对吧?).但这意味着AsyncTask的前提,即您不需要打扰处理程序,是错误的.它似乎也滥用了Handler,因为你在同一个线程上发送和接收消息(你在UI线程上创建它并在onPostExecute()中通过它发送它也在UI线程上执行).
最重要的是,即使使用了这种解决方法,您仍然会遇到这样的问题:当上下文被破坏时,您没有记录它触发的任务.这意味着您必须在重新创建上下文时重新启动任何任务,例如在屏幕方向更改后.这是缓慢而浪费的.
我对此的解决方案(在Droid-Fu库中实现)是维护WeakReference
s从组件名称到其唯一应用程序对象上的当前实例的映射.每当启动AsyncTask时,它都会在该映射中记录调用上下文,并且在每次回调时,它将从该映射中获取当前上下文实例.这可以确保您永远不会引用陈旧的上下文实例,并且您始终可以访问回调中的有效上下文,这样您就可以在那里进行有意义的UI工作.它也不会泄漏,因为引用很弱并且在没有给定组件的实例存在时被清除.
尽管如此,这是一个复杂的解决方法,需要对一些Droid-Fu库类进行子类化,这使得这种方法非常具有侵入性.
现在我只想知道:我是否只是大量遗漏某些东西,或者AsyncTask是否真的完全有缺陷?您的使用经验如何?你是怎么解决这些问题的?
感谢您的输入.
我正在尝试设置签名过程,以便密钥库密码和密钥密码不会存储在项目的build.gradle
文件中.
目前我在以下方面有build.gradle
:
android {
...
signingConfigs {
release {
storeFile file("my.keystore")
storePassword "store_password"
keyAlias "my_key_alias"
keyPassword "key_password"
}
}
buildTypes {
release {
signingConfig signingConfigs.release
}
}
}
Run Code Online (Sandbox Code Playgroud)
它的工作原理完全没有问题,但我不能把值的storePassword
,而且keyPassword
在我的仓库.我宁愿不把storeFile
和keyAlias
有两种.
有没有办法改变build.gradle
它,以便它从某些外部源获取密码(如仅存在于我的计算机上的文件)?
当然,更改的内容build.gradle
应该可以在任何其他计算机上使用(即使计算机无法访问密码).
我正在使用Android Studio和Mac OS X Maverics,如果它确实重要.
在我的应用程序中,我使用第三方代码触发一些警告.我查看了它们,可以安全地忽略它们.
现在我想以某种方式"标记"文件,因此Xcode不会对该文件中的代码显示任何警告.
我该怎么办?
如何使用锚定到按钮的自定义下拉菜单/弹出菜单?
我需要它像弹出菜单(锚定到视图)一样工作,并在我单击菜单中的项目时执行某些操作.
如何通过代码向菜单添加项目,保持菜单的高度,如果有超过5个项目,可以滚动它.我不需要添加任何图像,只需添加文本.
有谁知道检查是否已实施可选协议方法的最佳方法.
我试过这个:
if ([self.delegate respondsToSelector:@selector(optionalProtocolMethod:)] )
Run Code Online (Sandbox Code Playgroud)
代表是:
id<MyProtocol> delegate;
Run Code Online (Sandbox Code Playgroud)
但是,我收到一个错误,说respondsToSelector:
该协议中找不到该功能!
我想使用Python创建一个Word文档,但是,我希望尽可能多地重用现有的文档创建代码.我目前正在使用XSLT生成HTML文件,我以编程方式将其转换为PDF文件.但是,我的客户现在要求以Word(.doc)格式提供相同的文档.
到目前为止,我没有太多运气找到解决这个问题的方法.是否有人知道可能有助于解决此问题的开源库(或*gulp*专有解决方案)?
注意:所有可能的解决方案必须在Linux上运行.我相信这消除了pywin32.
我正在编写一个返回base64编码的PDF文件的Web服务,所以我的计划是在响应中添加两个标头:
Content-Type: application/pdf
Content-Transfer-Encoding: base64
Run Code Online (Sandbox Code Playgroud)
我的问题是:是Content-Transfer-Encoding
一个有效的HTTP标头?我认为它可能只适用于MIME.如果没有,我应该如何制作我的HTTP响应以表示我正在返回base64编码的PDF?谢谢.
编辑:
看起来HTTP不支持此标头.来自RFC2616第14节:
注意:虽然Content-MD5的定义与HTTP的实体主体的RFC 1864完全相同,但Content-MD5到HTTP实体主体的应用程序有几种不同于其应用程序的MIME实体 - 身体.一个是,与MIME不同,HTTP不使用Content-Transfer-Encoding,并且使用Transfer-Encoding和Content-Encoding.
我应该设置标题的任何想法?谢谢.
编辑2
在这个PHP参考手册页的注释中找到的许多代码示例似乎表明它实际上是一个有效的HTTP头:
我正在使用C#并希望使用JPEG格式保存图像.然而,.NET降低了图像的质量,并通过压缩来保存它们是不够的.
我想保存原始质量和大小的文件.我使用以下代码,但压缩和质量不像原始的.
Bitmap bm = (Bitmap)Image.FromFile(FilePath);
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
ImageCodecInfo ici = null;
foreach (ImageCodecInfo codec in codecs)
{
if (codec.MimeType == "image/jpeg")
ici = codec;
}
EncoderParameters ep = new EncoderParameters();
ep.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, (long)100);
bm.Save("C:\\quality" + x.ToString() + ".jpg", ici, ep);
Run Code Online (Sandbox Code Playgroud)
我正在归档工作室照片和质量和压缩是非常重要的.谢谢.
每次我尝试跳过一个电话时,我的应用程序都会崩溃.没有调试器它工作正常.
此外,当我在模拟器中运行应用程序时,无论是否使用调试器都可以.
最近我将Mac OS X 10.8升级到了10.9(Mavericks).升级前没有问题.
是什么导致了这个问题,我该如何解决?
下面是回溯.我的应用程序使用ARC.我已启用僵尸并添加了异常断点但没有检测到的僵尸,并且永远不会触发异常断点.
* thread #1: tid = 0x2503, 0x00000000, queue = 'com.apple.main-thread, stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x00000000
frame #1: 0x35e170c4 UIKit`-[UIApplication sendAction:to:from:forEvent:] + 72
frame #2: 0x35e17076 UIKit`-[UIApplication sendAction:toTarget:fromSender:forEvent:] + 30
frame #3: 0x35e17054 UIKit`-[UIControl sendAction:to:forEvent:] + 44
frame #4: 0x35e1690a UIKit`-[UIControl(Internal) _sendActionsForEvents:withEvent:] + 502
frame #5: 0x35e16e00 UIKit`-[UIControl touchesEnded:withEvent:] + 488
frame #6: 0x35d3f5f0 UIKit`-[UIWindow _sendTouchesForEvent:] + 524
frame #7: 0x35d2c800 UIKit`-[UIApplication sendEvent:] + 380
frame #8: 0x35d2c11a UIKit`_UIApplicationHandleEvent …
Run Code Online (Sandbox Code Playgroud) 在我的应用程序中,我使用Retrofit库进行同步 PUT
请求.问题是:有时候图书馆会抛出EOFException
s.
以下是其中一种情况的堆栈跟踪
29099-29269/com.mycompany.myapp D/Retrofit? java.io.EOFException
at okio.RealBufferedSource.readUtf8LineStrict(RealBufferedSource.java:192)
at com.squareup.okhttp.internal.http.HttpConnection.readResponse(HttpConnection.java:189)
at com.squareup.okhttp.internal.http.HttpTransport.readResponseHeaders(HttpTransport.java:101)
at com.squareup.okhttp.internal.http.HttpEngine.readResponse(HttpEngine.java:676)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:426)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:371)
at com.squareup.okhttp.internal.huc.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:466)
at retrofit.client.UrlConnectionClient.readResponse(UrlConnectionClient.java:73)
at retrofit.client.UrlConnectionClient.execute(UrlConnectionClient.java:38)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:321)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at $Proxy7.addEvents(Native Method)
at com.mycompany.myapp.api.MyService.addEvents(MyService.java:59)
Run Code Online (Sandbox Code Playgroud)
我尝试了以下展示的解决方案,但在我的案例中没有一个有用:
以下是我RestAdapter
在我的应用中创建的方式:
OkHttpClient okHttpClient = new OkHttpClient();
RestAdapter restAdapter = new RestAdapter.Builder()
.setEndpoint(Url)
.setRequestInterceptor(new RequestInterceptor()
{
@Override
public void intercept(RequestFacade request)
{
request.addHeader("Accept", "application/json");
request.addHeader("Content-Type", "application/json");
}
})
.setClient(new OkClient(okHttpClient))
.setLogLevel(RestAdapter.LogLevel.FULL)
.setErrorHandler(new MyErrorHandler())
.build();
Run Code Online (Sandbox Code Playgroud)
有没有人知道这个问题的其他解决方案?
顺便说一句,我不能使用涉及的解决方案, …
android ×4
xcode ×2
.net ×1
android-menu ×1
base64 ×1
c# ×1
code-signing ×1
compression ×1
concurrency ×1
debugging ×1
delegates ×1
eofexception ×1
gradle ×1
handler ×1
http ×1
image ×1
ios ×1
iphone ×1
java ×1
jpeg ×1
menu ×1
mime ×1
ms-word ×1
objective-c ×1
popupmenu ×1
protocols ×1
python ×1
rest ×1
retrofit ×1
warnings ×1
xcode5 ×1
xml ×1
xslt ×1