繁体   English   中英

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

[英]Android Bump Api Network on main thread exception

首先,我是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中运行它,但那么如何以及为什么?

我坚持这个问题已经有一天了......在发布它之后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");
    }
};

在后台流程中提出请求。

主线程上的网络有一个异常发生在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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM