小编the*_*osh的帖子

安排Android中的重复任务

我正在设计一个应用程序,只要应用程序位于前台,该应用程序就会定期向专用服务器发送状态.

在我通过网络搜索时,我看到了一些不同的方法,并想知道这样做的最佳方法是什么.

安排服务器调用的最佳方法是什么?

我看到的选项是:

  1. 计时器.

  2. ScheduledThreadPoolExecutor.

  3. 服务.

  4. AlarmManager的 BroadcastReciever .

你怎么看?

编辑:
我需要这个的原因是一个基于聊天的应用程序,它将所有用户操作发送到远程服务器.
即用户正在键入消息,用户正在阅读消息,用户在线,用户在线等.

这意味着每隔一段时间,我需要向服务器发送我正在做的事情,因为我和其他人打开聊天室,他们需要知道我在做什么.

与whatsapp消息反馈机制类似: 消息看起来交付

编辑#2:
现在几乎总是通过JobSchedulerAPI(或FirebaseJobDispatcher更低的API)安排重复任务,以防止电池耗尽问题,可以在Android培训的vitals部分阅读

android scheduled-tasks

116
推荐指数
3
解决办法
10万
查看次数

如何从ScheduledExecutorService中删除任务?

我有一个ScheduledExecutorService时间周期性的几个不同的任务scheduleAtFixedRate(Runnable, INIT_DELAY, ACTION_DELAY, TimeUnit.SECONDS);

我也有一个Runnable与此调度程序不同的用法.当我想从调度程序中删除其中一个任务时,问题就开始了.

有没有办法做到这一点?

我是否正确使用一个调度程序执行不同的任务?实现这个的最佳方法是什么?

java android scheduledexecutorservice

56
推荐指数
1
解决办法
4万
查看次数

JSON.getString不返回null

我有一个从服务器返回的响应,我期待一个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);

java json org.json

20
推荐指数
1
解决办法
1万
查看次数

在android中创建一个chatView布局

我正在创建一个聊天应用程序,我正在考虑如何创建实际的聊天视图.

我已经有聊天窗口本身的布局,但我正在考虑如何实现聊天消息.

我正在考虑创建一个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

19
推荐指数
4
解决办法
8万
查看次数

SharedPreferences访问耗时吗?

我目前正在尝试为我的应用测试第三方服务,并且需要确定每次特定运行时正在进行的每项测试.

由于每次运行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)

每次运行测试时都会运行此功能,还是可以在不担心海岸的情况下执行此操作?

如果答案是"耗时的",那么每次我进行测试以区分每项测试时,你会建议我做什么?

testing performance android sharedpreferences

19
推荐指数
1
解决办法
6355
查看次数

Session.isOpened()== true但Session.getAccessToken()==""

在我的应用程序中,我试图通过将Facebook会话信息(令牌和到期日期)传递给我的服务器来进行身份验证(登录).

我对应用服务器的登录顺序如下:

  1. 获得活跃的facebook会话.
  2. 如果会话有效,请获取令牌并将其发送到服务器.

在代码中:

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() …

android facebook android-facebook

16
推荐指数
1
解决办法
2619
查看次数

使用Retrofit API的MalformedJsonException?

我需要发送一个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)

android json gson retrofit

16
推荐指数
2
解决办法
3万
查看次数

GreenDAO支持表之间的多种关系

我一直在尝试使用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)

android android-sqlite greendao

12
推荐指数
1
解决办法
3530
查看次数

扩展类android.support.v4.view.ViewPager时出错

我一直在尝试为我的应用程序创建一个寻呼机,我<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)

android android-viewpager inflate-exception

11
推荐指数
3
解决办法
4万
查看次数

GreenDAO创建自动ID属性

有没有办法让DB以自动方式创建ID属性?

我想生成一些看起来像这样的东西:

Entity entity = schema.addEntity("MyEntity");
entity.addIdProperty().autoIncrement().primaryKey();
Run Code Online (Sandbox Code Playgroud)

这可能吗?

sqlite android greendao

10
推荐指数
1
解决办法
6018
查看次数