0

まず第一に、私は Android と Java の世界にまったく慣れていません (C/C++/Objective-C から来ました)。Android バンプ API (3.0、最新バージョン) を統合しようとしていますが、問題が発生しています。例をコピーしました。Android 2.2 では正常に動作し、バンプ サービスは正しく起動されますが、Android 3.0 以降では動作しません。アクティビティをロードするときに例外 (メイン スレッド 1 のネットワーク) が発生しました。この例外とそれを回避する方法はわかっていますが、この場合、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 で実行する必要がありますが、その方法と理由は何ですか?

4

3 に答える 3

2

私はこの問題を1日ほど続けました...そして文字通りここに投稿してから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");
    }
};
于 2012-07-05T09:09:36.627 に答える
0

バックグラウンドプロセスでリクエストを行います。

于 2012-07-05T09:07:22.323 に答える
0

メインスレッドのネットワークの1つの例外は、2.2と3.0以降で発生しています。違いは、asyncTaskで述べたように、3.0以降では、重い操作や遅い操作を含むすべてのものを別のスレッドに配置する必要があることです。

内部の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()で機能します。

于 2012-07-05T09:07:38.203 に答える