我试图通过使用mod_rewrite在php中写一点休息api.
我的问题是:我如何处理HTTP DELETE和PUT?例如,网址为:/ book/1234
其中1234是一本书的唯一ID.我想将这个id(1234)"重定向"到book.php,id为参数.我已经知道如何在php脚本中读取PUT和DELETE变量,但是如何在mod_rewrite中设置这个重写规则?
有任何想法吗?
编辑:GET的重写规则如下所示:
RewriteRule book/([0-9]+) book.php?id=$1 [QSA]
Run Code Online (Sandbox Code Playgroud)
如何为PUT和DELETE执行"参数转发"?据我所知HTTP POST,PUT和DELETE使用HTTP Request Body来传输参数值.所以我想我需要在HTTP请求体中附加参数.但我不知道如何用mod_rewrite做到这一点.
我可以做一些混合DELETE和GET吗?
RewriteCond %{REQUEST_METHOD} =DELETE
RewriteRule book/([0-9]+) book.php?id=$1 [QSA]
Run Code Online (Sandbox Code Playgroud)
然后在book.php中,我会使用$ _GET ['id']来检索book id,即使HTTP HEADER说HTTP METHOD是DELETE.它似乎不起作用......
我有一个IntentService,它应该像一个管理器,并在提交给ThreadPool的队列(Runnable)中创建任务.
我对IntentService的生命周期有点困惑:
该方法protected abstract void onHandleIntent (Intent intent)已在分离的线程上运行.在onHandleIntent我将创建一个新的Runnable实例并将其提交给ThreadPool.我的服务看起来像这样:
public class SyncService extends IntentService {
private final ThreadPoolExecutor threadPool;
public SyncService() {
super("SyncService");
BlockingQueue<Runnable> queue = new LinkedBlockingQueue<Runnable>();
threadPool = new ThreadPoolExecutor(1, 1, 20, TimeUnit.SECONDS, queue);
}
@Override
public void onCreate() {
super.onCreate();
EventBus.getInstance().register(this);
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getInstance().unregister(this);
}
@Override
protected void onHandleIntent(Intent intent) {
if (intent.getAction().equals("sync")){
threadPool.submit(new SyncRunnable());
}else
if(intent.getAction().equals("delete")){
threadPool.submit(new DeleteRunnable());
} else
if(intent.getAction().equals("register")){
threadPool.submit(new RegisterRunnable())
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
我买了一台新 Macbook,想使用gradle 发布插件上传我的 Android 库的新版本。它在我以前的 MacBook 上工作,但在我的新 MacBook 上签名档案被跳过。
我只是跑./gradlew :library:uploadArchives。这也应该包括签名。
...
任务:库:signArchives 已跳过
任务:库:上传档案
...
我已经导入了我的公钥-私钥.asc文件。然而,Nexus Sonatype 上缺少文件签名文件(尽管它在我之前的 MacBook 上运行得很好)。但现在 Nexus Sonatpype 说这个library.aar.asc缺失、library-javadoc.jar.asc缺失、library.pom.asc缺失library-sources.jar.asc。
知道我做错了什么吗?
我想知道在sqlite数据库中将图像存储为BLOB是一个好主意吗?有没有人有表现 - 存储图像(blob)的经验.
我的Android应用程序将是一个小的,它将需要处理20到100个图像(100 kb到每个图像1MB).最坏的情况:我想说,我的数据库可以达到100 MB的大小.这对数据库性能有重大影响吗?平均情况:我猜我的应用程序的普通用户有40张图像,每张图像200 kb,因此数据库的大小约为8 MB.顺便说一句.当然数据库还存储其他"正常"数据,所以它不仅仅是图像数据库:)
将存储在存储(内部或SD卡)上的图像的路径存储为更好的方法吗?我想从数据库中检索图像文件路径并从文件中打开并加载图像会稍慢一点(但不是很重要,因为我需要一次只加载两个图像).
第二个问题:如果我将使用第二种方法(在数据库中存储图像文件的路径并加载图像文件):磁盘缓存(DiskLruCache)在这种情况下是否有用?它会带来显着的性能提升吗?我的理解是磁盘缓存会存储位图(而不是编码的jpg或png),因此光盘缓存会直接从存储加载位图,我的应用程序将节省解码图像的时间(jpg或png).那是对的吗?顺便说一句.在"数据库方法"中,我将存储已经解码为位图的图像.所以在我看来它与光盘缓存类似,不是吗?
编辑:我忘了告诉你,我需要将图像存储在设备上.我不是在谈论缓存图像,例如我从Web服务中检索到的图像......
我有Adapter多种视图类型.我注意到onCreateViewHolder()即使这种情况经常被调用onCreateViewHolder(),onBindViewHolder()并且getItemViewType()正确实现.
例如,我的RecyclerView应该显示这样的不同项目的简单列表,并假设所有项目具有相同的视图高度,并且6个元素填充整个屏幕(匹配RecyclerView的高度):
> ViewType0
> ViewType0
> ViewType0
> ViewType0
> ViewType0
> ViewType1
> ViewType2
> ViewType2
> ViewType2
> ViewType2
> ViewType1
> ViewType1
> ViewType1
> ViewType0
> ViewType0
> ViewType0
Run Code Online (Sandbox Code Playgroud)
在滚动并到达列表的末尾时,似乎对于最后两个项目(ViewType0)RecyclerView调用onCreateViewHolder()但从我的观点来看,recyclerview应该回收(重用)已经存在的那个(列表顶部有5个是不是visibile)而不是为最后两个项目重新创建两个新的.
这种行为是正常的吗?我可以应用的设置是为了避免重新创建新的ViewHolder,因为应该有可重复使用的ViewHolders(从列表的顶部)?
我想为组件编写一种"blackbox测试",内部使用RxJava.
在内部,它使用Retrofit返回一个Observable来制作一个httpcall,然后用它.flatmap() 来对从改造中检索到的数据进行处理.我的想法是给这个组件一个Transformer用于在观察者上设置调度程序,如下所示:
class DefaultTransformer <T> implements Transformer<T, T> {
public Observable<T> call(Observable<T> observable) {
return observable.subscribeOn(Schedulers.newThread()).observeOn(AndroidSchedulers.mainThread());
}
}
Run Code Online (Sandbox Code Playgroud)
我的组件做了这样的事情:
void execute(Transformer<T, T> scheduler){
Observable<List<Team>> observable = retrofitApi.getLeague(leagueId, seasonId)
.flatMap(new Func1<LeagueWrapper, Observable<List<Team>>>() {
@Override public Observable<List<Team>> call(LeagueWrapper wrapper) {
return Observable.just(wrapper.getLeague().getTeams());
}
});
observable.compose(transformer);
observable.subscribe(this);
}
Run Code Online (Sandbox Code Playgroud)
在生产中我DefaultTransformer作为参数传递,但是对于单元测试,我想提交一个Transformer在单元测试的同一个线程上运行,所以一切都应该同步运行(不是异步).
我试过了:
class UnitTestTransformer <T> implements Transformer<T, T> {
public Observable<T> call(Observable<T> observable) {
return observable.subscribeOn(Schedulers.test()).observeOn(AndroidSchedulers.test());
}
}
Run Code Online (Sandbox Code Playgroud)
但它仍然在我的单元测试中运行异步.我也试过了Scheduler.immediate().toBlocking()似乎不是一个选择,因为它 …
我在我的Android应用程序中使用Dagger2.基本上我注入了一个HttpClient(接口)MainActivity.
@Module
public class MainActivityModule{
@Provides public HttpClient providesHttpComponent(){
return new RealHttpClient();
}
}
@Component( modules = MainActivityModule.class )
public interface MainActivityComponent {
public MainActivity injectActivity(MainActivity);
}
public class MainActivity extends Activity {
public void onCreate(Bundle saved){
super.onCreate();
injectDependencies();
}
protected void injectDependencies(){
Dagger_MainActivityComponent
.builder()
.mainActivityComponent( new MainActivityModule())
.build()
.injectActivity(this);
}
}
Run Code Online (Sandbox Code Playgroud)
到目前为止一切顺利,效果如预期.现在我想写一些单元测试(不是android仪器测试),而不是MainActivity我想要使用TestMainActivityModule的地方MainActivityModule.
@Module (overrides = true )
public class TestMainActivtiyModule extends MainActivityModule {
@Provides public HttpClient(){
return new MockHttpClient(); …Run Code Online (Sandbox Code Playgroud) 如何部分更新领域对象?
想象一下,我有一个这样的模型:
class Person {
@PrimaryKey long id;
String name;
Address address;
}
Run Code Online (Sandbox Code Playgroud)
假设我同步我的本地领域数据库与后端和后端给我只有Person用id和name地方名称已更改(无地址)。
如何仅更新Person.name?此外,我想Person.address保留在本地数据库中。
我使用它将gradle uploadArchives我的 android 开源库的人工制品(jar、源代码和 javadoc)上传到oss sonatype nexus 存储库。但是,不知何故uploadArchives似乎并行运行,因为在完成 gradle 后,我看到在oss sonatype上创建了多个临时存储库。一个包含 .jar,另一个包含源代码和 java 文档(或者在任何其他组合中,如 .jar 和源代码在一个临时存储库中,但 java 文档不在同一个中;它基本上一直在变化)。
即使禁用并行通过./gradlew uploadArchives -Dorg.gradle.parallel=false也无济于事。
我无法关闭/发布临时存储库,因为它只包含一些部分(如 java 文档和 .jar 但不包含源代码)而不是一个单独的临时存储库中的所有人工制品(其余部分以某种方式分发到其他临时存储库)。
知道如何解决这个问题吗?
在RxJava中,我有一个Subscriber我订阅的对象Observable.稍后(onComplete()调用了一段时间后)我创建了一个new Observable并Subscriber使用之前使用的相同实例进行订阅.但是,这似乎不起作用.订户不可重复使用吗?
例:
class Loader extends Subscriber<T> {
public void load(){
Observable.just("Foo").subscribe(this);
}
public void onComplete(){
// update UI
}
}
Run Code Online (Sandbox Code Playgroud)
在我的代码中,我想实例化Loader一次,并load()多次调用,例如在用户点击刷新按钮之后......
android ×7
gradle ×2
java ×2
rx-java ×2
caching ×1
dagger-2 ×1
gnupg ×1
http ×1
http-delete ×1
image ×1
junit ×1
mod-rewrite ×1
php ×1
realm ×1
rx-android ×1
sqlite ×1
threadpool ×1
travis-ci ×1
unit-testing ×1