我有一个对象层次结构,我需要通过RESTful API公开,我不确定我的URL应该如何构建以及它们应该返回什么.我找不到任何最佳做法.
假设我有继承动物的狗和猫.我需要对狗和猫进行CRUD操作; 我也希望能够对动物进行一般操作.
我的第一个想法是做这样的事情:
GET /animals # get all animals
POST /animals # create a dog or cat
GET /animals/123 # get animal 123
Run Code Online (Sandbox Code Playgroud)
问题是/ animals集合现在"不一致",因为它可以返回并获取不具有完全相同结构的对象(狗和猫).将集合返回具有不同属性的对象,它被认为是"RESTful"吗?
另一个解决方案是为每个具体类型创建一个URL,如下所示:
GET /dogs # get all dogs
POST /dogs # create a dog
GET /dogs/123 # get dog 123
GET /cats # get all cats
POST /cats # create a cat
GET /cats/123 # get cat 123
Run Code Online (Sandbox Code Playgroud)
但现在狗和猫之间的关系就失去了.如果想要检索所有动物,必须查询狗和猫的资源.每个新的动物子类型的URL数量也会增加.
另一个建议是通过添加以下内容来扩充第二个解决方案:
GET /animals # get common attributes of all animals
Run Code Online (Sandbox Code Playgroud)
在这种情况下,返回的动物将仅包含所有动物共有的属性,丢弃特定于狗的属性和特定于猫的属性.这允许检索所有动物,尽管细节较少.每个返回的对象都可以包含指向详细的具体版本的链接.
有什么意见或建议吗?
我正在使用Jersey为服务器组件创建REST Web服务.
我想在列表中序列化的JAXB注释对象如下所示:
@XmlRootElement(name = "distribution")
@XmlType(name = "tDistribution", propOrder = {
"id", "name"
})
public class XMLDistribution {
private String id;
private String name;
// no-args constructor, getters, setters, etc
}
Run Code Online (Sandbox Code Playgroud)
我有一个REST资源来检索一个看起来像这样的发行版:
@Path("/distribution/{id: [1-9][0-9]*}")
public class RESTDistribution {
@GET
@Produces("application/json")
public XMLDistribution retrieve(@PathParam("id") String id) {
return retrieveDistribution(Long.parseLong(id));
}
// business logic (retrieveDistribution(long))
}
Run Code Online (Sandbox Code Playgroud)
我还有一个REST资源来检索所有发行版的列表,如下所示:
@Path("/distributions")
public class RESTDistributions {
@GET
@Produces("application/json")
public List<XMLDistribution> retrieveAll() {
return retrieveDistributions();
}
// business logic (retrieveDistributions())
}
Run Code Online (Sandbox Code Playgroud)
我使用ContextResolver来自定义JAXB序列化,当前配置如下:
@Provider
@Produces("application/json")
public class …Run Code Online (Sandbox Code Playgroud) 我一直在阅读很多文章和文章,颂扬Parcelable在Serializable上的速度.我一直在使用两种方法来通过Intents在Activities之间传递数据,并且在两者之间切换时还没有注意到任何速度差异.我必须传输的典型数据量是5到15个嵌套对象,每个对象有2到5个字段.
由于我有大约30个必须可转移的类,因此实现Parcelable需要大量的样板代码来增加维护时间.我目前的要求之一是编译的代码应该尽可能小; 我希望通过使用Serializable over Parcelable可以节省一些空间.
我应该使用Parcelable还是没有理由在Serializable上使用它来处理这么少量的数据?还是有另一个原因我不应该使用Serializable?
我在我的应用程序中使用AlertDialog类.默认情况下,这些警报对话框具有透明背景.我试图使用不透明的背景,非常不成功.这些是我的风格:
<style name="MyOpaqueActivity" parent="@android:style/Theme.Dialog">
<item name="android:windowBackground">@drawable/my_background</item>
<item name="android:alertDialogStyle">@style/MyOpaqueAlertDialog</item>
</style>
<style name="MyOpaqueAlertDialog" parent="@android:style/Theme.Dialog.Alert">
<item name="android:background">#454545</item>
<item name="android:windowBackground">@drawable/my_background</item>
<item name="android:popupBackground">@drawable/my_background</item>
</style>
Run Code Online (Sandbox Code Playgroud)
我成功地为整个活动应用了"MyOpaqueActivity"样式(窗口背景更改为"my_background"),但它不适用于这些活动中的警报对话框."alertDialogStyle"属性和我的"MyOpaqueAlertDialog"样式似乎没有任何效果.
那么如何更改这些警报对话框的背景呢?
我需要在Android应用程序中运行定期任务.我目前使用这样的计时器:
final Handler guiHandler = new Handler();
// the task to run
final Runnable myRunnable = new Runnable() {
@Override
public void run() {
doMyStuff();
}
};
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
guiHandler.post(myRunnable);
}
}, 0, 30000); // run every 30 seconds
Run Code Online (Sandbox Code Playgroud)
这正是我所需要的,但是有一个问题:如果我在模拟器或手机上更改时间,计时器将停止运行.这是我更改时间时日志中显示的内容:
D/SystemClock( 331): Setting time of day to sec=1278920137
W/SystemClock( 331): Unable to set rtc to 1278920137: Invalid argument
Run Code Online (Sandbox Code Playgroud)
没有关于计时器被中断的事情,但是在系统时钟改变之后它显然不再运行.只要应用程序正在运行,我就需要让任务始终保持运行.
如果它像这样停止,我怎么能重启计时器?Timer或TimerTask上没有方法来检查它是否正在运行,所以我不知道何时重新安排它.有任何想法吗?
我需要创建一个Android库,我可以将其作为jar包含在任何Android应用程序中.我使用NetBeans 6.8,nbandroid插件和Android SDK.
我到目前为止采取的步骤是:
1)创建库项目,包含android.jar以访问Android类(该库使用android.util.Log和其他Android类).
2)将库编译为jar.
3)将库的jar添加到Android应用程序(右键单击项目节点下的Libraries并添加jar).
4)将<uses-library>添加到Android清单. (错误和不必要)
第3步至少允许我在应用程序的源代码中引用库的类,但是在编译时似乎并没有实际包含这些类.当我运行该应用程序时,我在日志中收到以下错误.
I/dalvikvm( 349): Could not find method mylibrarypackage.MyClass.myMethod, referenced from method myapplicationpackage.HomeActivity.onCreate
W/dalvikvm( 349): VFY: unable to resolve static method 985: Lmylibrarypackage/MyClass;.myMethod ()V
D/dalvikvm( 349): VFY: replacing opcode 0x71 at 0x000a
D/dalvikvm( 349): Making a copy of Lmyapplicationpackage/HomeActivity;.onCreate code (160 bytes)
D/AndroidRuntime( 349): Shutting down VM
W/dalvikvm( 349): threadid=3: thread exiting with uncaught exception (group=0x4001b188)
E/AndroidRuntime( 349): Uncaught handler: thread main exiting due to uncaught exception
E/AndroidRuntime( 349): java.lang.NoClassDefFoundError: mylibrarypackage.MyClass
E/AndroidRuntime( …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下内容显示Android活动:
我编写的布局符合这些标准,但对话框始终填满整个屏幕(请参见底部的垂直屏幕截图).
这是我的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<TextView android:id="@+id/header"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_marginLeft="10dp" android:layout_marginRight="10dp"
android:layout_marginTop="10dp" android:layout_marginBottom="10dp"
android:gravity="center_vertical"
android:textSize="18dip" android:textColor="#ffffff"
android:text="Sample Layout" />
<LinearLayout android:id="@+id/controls" android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
style="@android:style/ButtonBar">
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:text="Yes" />
<Button android:layout_width="wrap_content" android:layout_height="wrap_content"
android:layout_weight="1" android:text="No" />
</LinearLayout>
<ScrollView android:id="@+id/test" android:layout_below="@id/header"
android:layout_above="@id/controls"
android:layout_width="fill_parent" android:layout_height="wrap_content"
android:layout_marginBottom="5dp" android:layout_marginLeft="5dp"
android:layout_marginRight="5dp">
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content"
android:text="Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Integer dui odio, convallis vitae suscipit eu,
tincidunt non mi. Vestibulum faucibus …Run Code Online (Sandbox Code Playgroud) 我有一个小剪辑的问题,我一直无法使用通过tablerow一个EditText视图来解决.无论我尝试,所述的EditText视图要么剪切(附截图),或者,如果设置了shrinkColumns为0或1,标签文本消失(和的EditText视图占据整个宽度).布局如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical" android:padding="10dip">
<TableLayout android:orientation="vertical"
android:layout_width="fill_parent" android:layout_height="fill_parent">
<TableRow android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_height="wrap_content">
<TextView android:paddingRight="10dip" android:layout_column="1"
android:text="Label Text" />
<EditText android:text="Very long text that makes the text view go on clipping frenzy"
android:layout_width="wrap_content" android:layout_height="wrap_content" />
</TableRow>
</TableLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
我试过它在QVGA和HVGA,一个的HTC Hero上2.1和野火2.1上运行,以及一个2.2模拟器.我也玩过clipToPadding属性,这在我的情况下似乎没什么帮助.如果我使用长文本设置提示属性并将文本值保留为空,则会出现相同的问题.
由于我没有做任何特别复杂的事情,我怀疑我身边有一个简单的错误.任何想法,提示或建议都非常感谢.
干杯!

android ×6
dialog ×2
api ×1
background ×1
buttonbar ×1
clipping ×1
inheritance ×1
jar ×1
jax-rs ×1
jaxb ×1
jersey ×1
json ×1
netbeans ×1
parcelable ×1
polymorphism ×1
rest ×1
scrollview ×1
serializable ×1
systemtime ×1
tablelayout ×1
text ×1
timer ×1