2

我一直在遇到一个问题,它只是把我逼到了墙角。

在这个黑莓应用程序中,我有一个我想要坚持的课程。它实现了 net.rim.device.api.util.Persistable。现在由于某种原因,当我这样做时:

Persistent Object store = PersistentStore.getPersistentObject(M3Session.ID);

JVM 吐出并抱怨类 net.rim.device.api.util.Persistable 无法访问其超级接口 net.rim.vm.Persistable ...

我不知道我做错了什么。net_rim_api.jar 应该在我的类路径中,我正在使用这个ant script构建我的项目。

如果有帮助,我将使用 Intelij 11 社区版作为我的 IDE。

这是我坚持的课程:

package com.transcel.m3.ir;

/**
 * Created with IntelliJ IDEA.
 * User: Marc Byfield
 * Date: 9/10/12
 * Time: 11:24 PM

 */

import net.rim.device.api.system.Application;
import net.rim.device.api.util.Persistable;
import net.rim.device.api.util.StringUtilities;

import java.util.Date;

public class M3Session implements Persistable {

    private String key;
    private long timeCreated;
    public final static long TIMEOUT = 1200000L;
    static String ApplicaitonID = Application.getApplication().getClass().getName();
    static String STORE_NAME = "session_store";
    public final static long ID = StringUtilities.stringHashToLong(ApplicaitonID + STORE_NAME);


    public String getKey() {
        return key;
    }

    public void setKey(final String key) {
        this.key = key;
        Date newTime = new Date();
        this.timeCreated = newTime.getTime();
    }

    public boolean equals(final Object o) {
        if (this == o) return true;
        if (!(o instanceof M3Session)) return false;

        final M3Session m3Session = (M3Session) o;

        return !(key != null ? !key.equals(m3Session.key) : m3Session.key != null);

    }

    public int hashCode() {
        return key != null ? key.hashCode() : 0;
    }

    public String toString() {
        return "M3Session{" +
                       "key='" + key + '\'' +
                       ", timeCreated=" + timeCreated +
                       '}';
    }

    public boolean isValid() {
        return key.length() != 0 && !hasExpired();

    }

    private boolean hasExpired() {
        Date newTime = new Date();
        return newTime.getTime() - this.timeCreated >= TIMEOUT;
    }

    public M3Session(final String key) {
        this.setKey(key);
    }
}

这是使用它的类:

package com.transcel.m3.api;

/**
 * @Author Marc Byfield
 * Date: 9/10/12
 * Time: 11:05 AM
 */

import com.transcel.m3.ir.M3Session;
import com.transcel.m3.ir.User;
import com.transcel.m3.transport.M3Connector;
import com.transcel.m3.transport.Operations;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import org.json.me.JSONObject;

import java.io.IOException;
import java.util.Hashtable;


public class Authentication implements Runnable {

    private M3Session session;
    private static PersistentObject store;
    private User user;

    public Authentication(String user, String pass) {
        store = PersistentStore.getPersistentObject(M3Session.ID);
        this.user = new User(user, pass);
        session = (M3Session) store.getContents();
        if (session == null || !session.isValid()) {
            login(user, pass);
        }
    }

    public M3Session getSession() {
        return session;
    }


    private void login(String username, String pass) {

        Hashtable user = new Hashtable(2);
        user.put("username", username);
        user.put("password", pass);

        String result;
        try {
            result = M3Connector.sendRequest(Operations.LOGIN, user);
            JSONObject sessionJSON = new JSONObject(result);
            if (sessionJSON.has("session_key")) {
                session = new M3Session(sessionJSON.getString("session_key"));
                synchronized (store) {
                    store.setContents(session);
                    store.commit();
                }
            } else {
                synchronized (store) {
                    store.setContents(null);
                    store.commit();
                }
            }

        } catch (IOException ioe) {
            synchronized (store) {
                store.setContents(null);
                store.commit();
            }
        }
    }


    public void run() {
        if (!session.isValid())
            login(user.getPhoneNum(), user.getPass());
        try {
            wait(M3Session.TIMEOUT);
        } catch (InterruptedException ie) {
            this.login(user.getPhoneNum(), user.getPass());
        }
    }
}

希望这可以帮助

4

1 回答 1

2

我很高兴看到有人在 BlackBerry 开发时使用 IDEA 和单元测试!

如果您查看net_rim_api.jar内部,您将找不到任何net.rim.vm.*类(虚拟机类,有时您也可以使用内部具有本机调用的类),这就是您遇到此问题的原因。我正在使用的工作方法 - 通过创建自己的类来伪造 RIM api,这些类与 RIM 类具有相同的合同,并通过它测试类路径而不是原始 RIM 库。这是相当大的开销,但它有效。也许我们可以编写一些以自动方式执行此操作的工具(会考虑一下,也许是开源的)。

我还应该警告您有关Persistable界面的信息。如果您更改了该类,您将遇到更新问题。将数据转换为HashtableJSON /XML并使用Persistable.

于 2012-09-18T16:29:09.823 回答