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 スクリプトを使用してプロジェクトを構築しています。

Intelij 11 Community エディションを 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クラスと同じコントラクトを持つ独自のクラスを作成し、元のRIMライブラリの代わりにテストクラスパスを渡すことにより、RIM apiを偽造します。これはかなり大きなオーバーヘッドですが、うまくいきます。おそらく、これを自動的に行うツールを作成することができます(それについては考えますが、おそらくオープンソースです)。

インターフェイスについても警告する必要がありPersistableます。そのクラスを変更すると、更新で問題が発生しますHashtableデータをまたはJSON/XMLに変換してで保存する方が安全Persistableです。

于 2012-09-18T16:29:09.823 に答える