我正在设计一个应用程序,只要应用程序位于前台,该应用程序就会定期向专用服务器发送状态.
在我通过网络搜索时,我看到了一些不同的方法,并想知道这样做的最佳方法是什么.
安排服务器调用的最佳方法是什么?
我看到的选项是:
计时器.
服务.
带AlarmManager的 BroadcastReciever .
你怎么看?
编辑:
我需要这个的原因是一个基于聊天的应用程序,它将所有用户操作发送到远程服务器.
即用户正在键入消息,用户正在阅读消息,用户在线,用户在线等.
这意味着每隔一段时间,我需要向服务器发送我正在做的事情,因为我和其他人打开聊天室,他们需要知道我在做什么.
与whatsapp消息反馈机制类似:

编辑#2:
现在几乎总是通过JobSchedulerAPI(或FirebaseJobDispatcher更低的API)安排重复任务,以防止电池耗尽问题,可以在Android培训的vitals部分阅读
我有一个ScheduledExecutorService时间周期性的几个不同的任务scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);
我也有一个Runnable与此调度程序不同的用法.当我想从调度程序中删除其中一个任务时,问题就开始了.
有没有办法做到这一点?
我是否正确使用一个调度程序执行不同的任务?实现这个的最佳方法是什么?
我有一个从服务器返回的响应,我期待一个String值,所以我写这个来解析它
public String getMessageFromServer(JSONObject response) {
String msg = response.getString("message");
return msg;
}
Run Code Online (Sandbox Code Playgroud)
然后,当我在我的代码中使用它并null从服务器获取值时,函数不返回null,而是返回"null".
我看过这个错误报告,但我没有看到解决方案.
编辑:
我有一个很小的黑客来解决这个问题,但它很难看,我正在寻找一个更好的解决方案:
public String getMessageFromServer(JSONObject response) {
Object msg = response.get("message");
if(msg == null) {
return null;
}
return (String) msg;
}
Run Code Online (Sandbox Code Playgroud)
编辑#2:
多年以后,回到这个问题,我看到我在这里并没有完全错误,并且JSONObject有一个内置的方法.
从a获取可选值的方法JSONObject是使用此方法 JSONObject.optString("message", DEF_VALUE);
我正在创建一个聊天应用程序,我正在考虑如何创建实际的聊天视图.
我已经有聊天窗口本身的布局,但我正在考虑如何实现聊天消息.
我正在考虑创建一个TableLayout,每一行将是用户图像和聊天消息(或泡沫或什么不是).
有没有人知道如何设计和创建这些行?
这就是我现在所做的:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/background_light"
android:orientation="vertical"
android:weightSum="10" >
<ScrollView
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_weight="1" >
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:stretchColumns="1" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<!-- insert chat message here !-->
</TableRow>
<View
android:layout_height="2dip"
android:background="#000" />
<TableRow
android:id="@+id/tableRow2"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<!-- next chat message --!>
</TableRow>
</TableLayout>
</ScrollView>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="9"
android:orientation="horizontal" >
<EditText
android:id="@+id/chatLine"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="Say:"
android:imeOptions="actionSend"
android:singleLine="true" />
</LinearLayout>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
android android-custom-view android-layout android-tablelayout
我目前正在尝试为我的应用测试第三方服务,并且需要确定每次特定运行时正在进行的每项测试.
由于每次运行testApp时都可以进行多次测试,因此我需要识别每个测试.
我想到的是存储设备名称和构建(这里没有很多设备),以及每个测试的索引.
private String getTestId(){
SharedPreferences settings = getPreferences(0);
SharedPreferences.Editor editor = settings.edit();
int testNumber = settings.getInt("id", 0);
editor.putInt("id", testNumber+1);
editor.commit();
String id = Build.DEVICE + Build.VERSION.RELEASE+" - test number: "+testNumber;
return id;
}
Run Code Online (Sandbox Code Playgroud)
每次运行测试时都会运行此功能,还是可以在不担心海岸的情况下执行此操作?
如果答案是"耗时的",那么每次我进行测试以区分每项测试时,你会建议我做什么?
在我的应用程序中,我试图通过将Facebook会话信息(令牌和到期日期)传递给我的服务器来进行身份验证(登录).
我对应用服务器的登录顺序如下:
在代码中:
Session session = Session.getActiveSession();
if(session != null && session.isOpened() && !didLogin) {
didLogin = true;
String token = session.getAccessToken();
Date expires = session.getExpirationDate();
loginWithFacebookSession(token, expires);
}
Run Code Online (Sandbox Code Playgroud)
我注意到,突然间,经过几个月的工作就好了,发送到服务器的信息有时无效,特别token是空字符串,这expires是一个无效的日期.
在通过Facebook SDK(版本3.0.1)后,我发现可能是我的错误的基础:
private static final Date MIN_DATE = new Date(Long.MIN_VALUE);
private static final Date ALREADY_EXPIRED_EXPIRATION_TIME = MIN_DATE;
private static final Date DEFAULT_LAST_REFRESH_TIME = new Date();
static AccessToken createEmptyToken(List<String> permissions) {
return new AccessToken("", ALREADY_EXPIRED_EXPIRATION_TIME, permissions, AccessTokenSource.NONE,
DEFAULT_LAST_REFRESH_TIME);
}
Run Code Online (Sandbox Code Playgroud)
这意味着在此过程中的某个地方,Facebook SDK正在创建一个空令牌并将其返回SessionState.Category.OPENED_CATEGORY.
为什么session.isOpened() …
我需要发送一个json到我的webservice,json是:
{
"Sala": {
"usuario": "%@",
"adversario": "%@",
"atualizacao": "%@",
"device": "%@",
"device_tipo": "ios"
}
}
Run Code Online (Sandbox Code Playgroud)
.我正在尝试使用Retrofit API 1.8.当我尝试发送帖子时抛出一个异常.
例外:
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 7 path $
Run Code Online (Sandbox Code Playgroud)
我正在尝试这个
public class ChatObject {
private String usuario;
private String adversario;
private String atualizacao;
private String email;
private String device;
private String device_tipo;
Run Code Online (Sandbox Code Playgroud)
改造界面
@POST("/WsChat/interacao.json")
public void onReceiveMessage(@Body ChatObject obj,
Callback<JsonElement> response);
Run Code Online (Sandbox Code Playgroud)
器物
public void receiveMessage(){
///{\"Sala\":{\"usuario\":\"%@\",\"adversario\":\"%@\",\"atualizacao\":\"%@\",\"device\":\"%@\",\"device_tipo\":\"ios\"}}
ChatObject chatObject = new ChatObject(BatalhaConfigs.USUARIO_EMAIL,
BatalhaConfigs.ADVERSARIO_EMAIL,
new Date().toString(), …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用GreenDAO创建数据库模型.当我尝试在不同的表之间创建多个关系时,问题就出现了.
基本上,我有一张Message桌子,一张Conversation桌子和一张User桌子.
用户有一个消息列表,并且消息具有父对话.
我尝试编写此代码来创建数据库:
private static void addUser(Schema schema) {
user = schema.addEntity("User");
userId = user.addIdProperty().getProperty();
user.addStringProperty("facebookId").unique().index();
user.addStringProperty("firstName");
user.addStringProperty("lastName");
user.addStringProperty("fullName");
user.addStringProperty("photoUrl");
}
private static void addMessage(Schema schema) {
message = schema.addEntity("Message");
messageId = message.addIdProperty().getProperty();
message.addStringProperty("messageId").primaryKey();
message.addDateProperty("date");
message.addStringProperty("content");
message.addStringProperty("typeString");
}
private static void addConversation(Schema schema) {
conversation = schema.addEntity("Conversation");
conversation.addIdProperty();
conversation.addStringProperty("conversationId");
// REST OF THE CODE
}
private static void fakeRelationship(Schema schema) {
Property author = message.addLongProperty("author").getProperty();
Property parent = message.addLongProperty("parent").getProperty();
message.addToOne(user, author);
message.addToOne(conversation, parent); …Run Code Online (Sandbox Code Playgroud) 我一直在尝试为我的应用程序创建一个寻呼机,我<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15" />根据这篇博文发表了我的代码.
寻呼机活动的XML:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<android.support.v4.view.ViewPager
android:id="@+id/instructionsViewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
适配器代码:
public class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
// TODO Auto-generated method stub
return 2;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return (arg0 == ((View) arg1));
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
@Override
public Object instantiateItem(ViewGroup container, int position) { …Run Code Online (Sandbox Code Playgroud) 有没有办法让DB以自动方式创建ID属性?
我想生成一些看起来像这样的东西:
Entity entity = schema.addEntity("MyEntity");
entity.addIdProperty().autoIncrement().primaryKey();
Run Code Online (Sandbox Code Playgroud)
这可能吗?