1

我在我的 android 应用程序中使用Gimbal SDK 来实现地理围栏功能。他们提供的示例代码让我大吃一惊。示例代码如下包 com.gimbal.hello_gimbal_android;

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.gimbal.android.CommunicationManager;
import com.gimbal.android.Gimbal;
import com.gimbal.android.PlaceEventListener;
import com.gimbal.android.PlaceManager;
import com.gimbal.android.Visit;


public class MainActivity extends ActionBarActivity {

    private PlaceManager placeManager;
    private PlaceEventListener placeEventListener;
    private ArrayAdapter<String> listAdapter;
    private ListView listView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1);
        listView = (ListView) findViewById(R.id.list);
        listView.setAdapter(listAdapter);

        listAdapter.add("Setting Gimbal API Key");
        listAdapter.notifyDataSetChanged();
        Gimbal.setApiKey(this.getApplication(), "YOUR_API_KEY_HERE");

        placeEventListener = new PlaceEventListener() {
            @Override
            public void onVisitStart(Visit visit) {
                listAdapter.add(String.format("Start Visit for %s", visit.getPlace().getName()));
                listAdapter.notifyDataSetChanged();
            }

            @Override
            public void onVisitEnd(Visit visit) {
                listAdapter.add(String.format("End Visit for %s", visit.getPlace().getName()));
                listAdapter.notifyDataSetChanged();
            }
        };

        placeManager = PlaceManager.getInstance();
        placeManager.addListener(placeEventListener);
        placeManager.startMonitoring();

        CommunicationManager.getInstance().startReceivingCommunications();
    }

}

他们的示例应用程序 github 链接。

现在他们的地方事件监听器实现让我感到惊讶。我期待一个待定的服务意图或某种广播意图来监听这些地方事件,因为大多数此类库都用于通知应用程序。这很明显。因为即使应用程序处于终止状态,也应该触发此类事件。但是这里PlaceEventListener只是一个抽象类,我们正在使用 new Operator 创建它的实例,并提供抽象方法的不完整功能。

因此,当我的活动将被销毁时,他们的 SDK 不会在onVisitStart () 和 PlaceEventListener () 方法中提供回调,因为placeEventListener实例应该被销毁或为空。

我担心的是

  1. Gimabl SDK 防止从垃圾收集器中销毁主要活动类实例只是为了保留 placeEventListner
    实例引用?如果是这样,我认为这是一个糟糕的设计,因为如果我们可以从这么多活动中使用新的 placeEventListner 并且所有这些都会阻止 GC。
  2. 另外运行后台服务只是为了收听这些事件对我来说似乎并不好。他们的 SDK 应该使我的 android 应用程序的某些组件诞生(例如触发某些服务或通过广播地点事件来调用广播接收器)。

*编辑:一种可能的方法是在 Android 应用程序的 Application 类中实现侦听器接口,但由于其他一些原因,我试图避免它。那么,我想在哪里实施呢?

4

1 回答 1

1

你为什么不把你的监听器直接放到一个服务中,并在你的活动可见时通知你的传入事件?

于 2016-04-13T09:29:40.343 回答