主线程异常上的Android Bump Api网络

时间:2012-07-05 09:01:13

标签: java android multithreading exception android-asynctask

首先,我是Android和JAVA世界的新手(来自C / C ++ / Objective-C)。 我正在尝试集成Android bump API(3.0,最新版本),但我遇到了麻烦。 我复制了这个例子,它在Android 2.2下工作正常,碰撞服务正确启动,但对于Android 3.0及其上层它不起作用。 在加载我的活动时,我有一个异常(主线程上的网络),我知道这个异常以及如何避免它,但在这种情况下,Bump声明他们在自己的线程中运行他们的API所以我不这样做真的知道我为什么得到它。他们说你不需要运行一个或多个任务。

以下是我的活动

的示例
public class BumpActivity extends Activity {
private IBumpAPI api;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.bump);

    bindService(new Intent(IBumpAPI.class.getName()), connection,
            Context.BIND_AUTO_CREATE);

    IntentFilter filter = new IntentFilter();
    filter.addAction(BumpAPIIntents.CHANNEL_CONFIRMED);
    filter.addAction(BumpAPIIntents.DATA_RECEIVED);
    filter.addAction(BumpAPIIntents.NOT_MATCHED);
    filter.addAction(BumpAPIIntents.MATCHED);
    filter.addAction(BumpAPIIntents.CONNECTED);
    registerReceiver(receiver, filter);



}


@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
}

private final ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName className, IBinder binder) {

        Log.i("BumpTest", "onServiceConnected");
        api = IBumpAPI.Stub.asInterface(binder);
        try {
            api.configure("API_KEY", "Bump User");
        } catch (RemoteException e) {
            Log.w("BumpTest", e);
        }
        Log.d("Bump Test", "Service connected");
    }

    @Override
    public void onServiceDisconnected(ComponentName className) {
        Log.d("Bump Test", "Service disconnected");
    }
};
}

声音就像在api.configure上的连接服务期间出现问题.... 我应该在一个单独的线程或它自己的AsynchTask中运行它,但那么如何以及为什么?

3 个答案:

答案 0 :(得分:2)

我坚持这个问题已经有一天了......在发布这里之后2分钟,我解决了这个问题...... 我只是将api.configure放在一个单独的线程上(比AsynchTask短)。

private final ServiceConnection connection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName className, IBinder binder) {

        Log.i("BumpTest", "onServiceConnected");
        api = IBumpAPI.Stub.asInterface(binder);
        new Thread() {
            public void run() {
                try {
                    api.configure("API_KEY",
                            "Bump User");
                } catch (RemoteException e) {
                    Log.w("BumpTest", e);
                }

            }
        }.start();

        Log.d("Bump Test", "Service connected");
    }

    @Override
    public void onServiceDisconnected(ComponentName className) {
        Log.d("Bump Test", "Service disconnected");
    }
};

答案 1 :(得分:0)

在后台流程中提出请求。

答案 2 :(得分:0)

主线程上的网络有一个例外发生在2.2和3.0以及更高版本,不同之处在于3.0及以上它们迫使你将涉及一些重或慢的操作的所有内容放在不同的线程中,正如你所说的那样asyncTask。

你只需创建一个内部asyncTask并在其onBackground方法上放置你的api.configure:)

class LoadBumpAsyncTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        try {
        api.configure("9b17d663752843a1bfa4cc72d309339e", "Bump User");
    } catch (RemoteException e) {
        Log.w("BumpTest", e);
    }
        return null;
    }

}

只需在已连接的服务上致电new LoadBumpAsyncTask().execute(),即可使用。