问题

执行gradle-tomcat-plugin的tomcatRun任务时,服务器正常启动,没有任何异常,输出的log也没有异常,但是访问时返回404页面

阅读更多

JVM Hot Swapping

从Java1.4启,JVM引入了HotSwap,能够在Debug的时候更新类的字节码,所有新式的IDE(包括Eclipse、IDEA和NetBeans)都支持这一技术。但是它只能用来更新方法体,这一定程度上限制了它的实用性。

阅读更多

介绍

Swagger

Swagger是用来描述和文档化RESTful API的一个项目。Swagger Spec是一套规范,定义了该如何去描述一个RESTful API。类似的项目还有RAMLAPI Blueprint。 根据Swagger Spec来描述RESTful API的文件称之为Swagger specification file,它使用JSON来表述,也支持作为JSON支持的YAML。

阅读更多

Concurrency基础

Executor

Executor是一个用来执行Runable实例的对象,接口定义如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* An object that executes submitted {@link Runnable} tasks. This
* interface provides a way of decoupling task submission from the
* mechanics of how each task will be run, including details of thread
* use, scheduling, etc. An {@code Executor} is normally used
* instead of explicitly creating threads.
*/
public interface Executor {
/**
* Executes the given command at some time in the future. The command
* may execute in a new thread, in a pooled thread, or in the calling
* thread, at the discretion of the {@code Executor} implementation.
*
* @param command the runnable task
* @throws RejectedExecutionException if this task cannot be
* accepted for execution
* @throws NullPointerException if command is null
*/
void execute(Runnable command);
}

阅读更多

Interceptors

Junit4.7引入了一个新功能叫做”Interceptors”,旨在以一个更为清晰简单的API,带回JUnitmeta-testing的能力。但是之后又被重新命名为”Rule”。

Meta-testing

Junit擅长表达尽量少的测试逻辑。在Junit3中,你能够以不同的方式控制测试运行过程。Junit4简化的代价就是失去了这个“meta-testing”。这不影响简单测试,但是限制了更为强大的测试。现在Junit4重新把meta-testing带了回来。

比如说,你想输出一个log当每个测试失败的时候。

阅读更多

同源策略

Same-Origin Policy根据origin限制浏览器通过脚本或者文档执行特定的动作。origin指的是URL的path之前的所有的部分(比如说,http://www.example.com )。对于一些动作,浏览器会比较origins,如果它们不匹配,则不运行继续执行。比如说:

  • 一个父document不能访问来自不同origin的<iframe>的内容。这可以阻止恶意网站打开你们的银行网站,偷取你的安全秘钥
  • 一个document可以通过表单post发送信息,但是跨域AJAX请求通常是不允许的

针对同源策略,有两个方案可以解决这个问题。

阅读更多

错误

多个AsyncTaskLoader同时执行的时候,偶尔会闪退。 错误信息大致如下:

1
2
@@@ ABORTING: INVALID HEAP ADDRESS IN dlfree
Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1)

阅读更多

SwipeRefreshLayout 可以用于通过下滑的手势刷新View内容的情况。使用起来很简单,用SwipeRefreshLayout包裹需要刷新的View即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@android:id/list"
style="@style/ListView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</android.support.v4.widget.SwipeRefreshLayout>

阅读更多

ScrollView 用来包裹一个视图,通过滚动页面使它能够超出物理的显示。ScrollView 本身是一个 FrameLayout, 以为着它只能包含一个子视图。子视图通常使用垂直方向的LinearLayout。

ScrollView 绝不应该和ListView一起使用,应为ListView会自己处理垂直方向的滚动。TextView也会处理自己的滚动,所以通常也不需要ScrollView,但是一起使用可以达到TextView在一个大容器中的效果

默认情况下,子视图的的layout_height的wrap_content,对子视图设定任何的高度都是无效的。如果fillViewport设置为true,那么子视图会填满整个ScollView。这在一些页面的按钮需要在最下方显示的时候是很有用的。

Fork me on GitHub