2012-07-05 83 views
0

首先,我是很新的Android和Java世界(從C/C++/Objective-C的推出)。 我試圖整合Android Bump API(3.0,最新版本),但我遇到了麻煩。 我複製了這個例子,它在Android 2.2下工作正常,凹凸服務啓動正確,但是對於Android 3.0和上層它不起作用。 我有一個例外(在主線程一個網絡)加載我的活動時,我知道這個例外,以及如何避免它,但在這種情況下,凹凸狀態,他們跑他們的API在自己的線程,所以我不要」我真的知道我爲什麼得到它。他們說你不需要運行一個或多個任務。Android的凹凸阿比網絡上的主線程異常

這裏是我的活動的樣本上api.configure連接服務過程中發生

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"); 
    } 
}; 
} 

聽起來像問題.... 我應該在一個單獨的線程或它自己的AsynchTask運行,但那又如何?爲什麼?在後臺進程

回答

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"); 
    } 
}; 
0

製作要求。

+0

其實我已經找到了答案,我被困在這個問題一天......從字面上2分鐘張貼後,我解決它... :) – Dimillian 2012-07-05 09:08:04

+0

所以你有什麼解決辦法嗎? – 2012-07-05 09:09:35

+0

我張貼:)只是一個單獨的線程 – Dimillian 2012-07-05 09:14:27

0

在主線程一個例外,在網絡中的2.2和3.0及以上正在發生,所不同的是,在3.0及以上版本,他們迫使你把涉及在不同的線程一些重或慢OPS的一切,就像你說的在一個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(),並將努力。

+0

好的,謝謝,我貼我的解決方案,簡單的事實。 – Dimillian 2012-07-05 09:10:09