3

這是叫我的服務類:爲什麼我的ServiceConnection方法從未執行?

public class TicketList extends ListActivity 
{ 
private ArrayList<Tickets> alTickets = new ArrayList<Tickets>(); 
private boolean listCreated = false; 
private static Drawable background = null; 
private Resources res; 
private Tickets ticket = null; 
private TicketConnector localService; 

/** 
* Called when the activity is first created. 
* 
*/ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.ticketlist); 

    if(!listCreated) 
    { 
     connectService(); 
     //populateList(); 

     res = getResources(); 
     background = res.getDrawable(R.drawable.background); 
     listCreated = true; 
    } 

    TicketAdapter StatisticsAdapter = new TicketAdapter(this, alTickets); 
    setListAdapter(StatisticsAdapter); 
} 

/** 
* Populates the ListView. 
* This needs to be done once the Activity is created and if the menu entry refresh is hit. 
*/ 
private void populateList() 
{ 
    try 
    {   
     String jsonString = localService.queryData(new String[] {"getTicketList"}, new String[] {"Offen"}); 
     //String jsonString = new TicketConnector().queryData(new String[] {"getTicketList"}, new String[] {"Offen"}); 

     JSONObject jsonObj = new JSONObject(jsonString); 
     JSONArray ticketArray = jsonObj.getJSONArray("tickets"); 

     Tickets[] tickets = new Tickets[ticketArray.length()]; 
     for (int i=0;i<ticketArray.length();i++) 
     { 
      JSONObject object = ticketArray.getJSONObject(i).getJSONObject("ticket"); 

      ticket = new Tickets(object.getString("id"), object.getString("color"), object.getString("priority")); 
      alTickets.add(ticket); 
     } 
    } 
    catch (Exception e) 
    { 
     Log.e("DayTrader", "Exception getting JSON data", e); 
    } 
} 

private void connectService() 
{ 
    Intent intent = new Intent(getApplicationContext(), TicketConnector.class); 
    bindService(intent, connection, Context.BIND_AUTO_CREATE); 
} 

public void getData() 
{ 
    String s = localService.queryData(new String[] {"getTicketList"}, new String[] {"Offen"}); 
} 

ServiceConnection connection = new ServiceConnection() 
{ 
    @Override 
    public void onServiceConnected(ComponentName name, IBinder binder) 
    { 
     Toast.makeText(TicketList.this, "Service connected",Toast.LENGTH_SHORT).show(); 

     localService = ((TicketConnector.LocalBinder)binder).getService(); 
     Log.i("INFO", "Service bound: TicketConnector"); 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName name) 
    { 
     Toast.makeText(TicketList.this, "Service disconnected",Toast.LENGTH_SHORT).show(); 
     localService = null; 
     Log.i("INFO", "Service unbound: TicketConnector"); 
    } 
}; 
} 

這是服務:

public class TicketConnector extends Service 
{ 
private SharedPreferences settings = null; 

// This is the object that receives interactions from clients. See 
// RemoteService for a more complete example. 
private final IBinder binder = new LocalBinder(); 

private String username = null; 
private String password = null; 
private String server = null; 
private String port = null; 
private String urlStr = null; 

private String result = null; 

@Override 
public void onCreate() 
{ 
    settings = CMDBSettings.getSettings(this); 
    username = settings.getString("username", ""); 
    password = settings.getString("password", ""); 
    server = settings.getString("server", ""); 
    port = settings.getString("serverport", ""); 
} 

@Override 
public IBinder onBind(Intent intent) 
{ 
    return binder; 
} 

@Override 
public void onDestroy() 
{ 

} 

public String queryData(String[] actions, String[] category) 
{ 
    //http://localhost:8080/MobileCMDB/TicketListener?format=json&actions=getTicketList&ticketcategory=Open 
    urlStr = "http://"+server+":"+port+"/MobileCMDB/TicketListener?format="; 
    new jsonParser().execute(actions); 

    return result; 
} 

abstract class BaseParser extends AsyncTask<String, Integer, String> 
{ 
    protected BaseParser(String format) 
    { 
     urlStr += format; 
    } 

    private String makeUrlString(String[] actions, String[] category) 
    { 
     StringBuilder sb = new StringBuilder(urlStr); 
     for (int i=0;i<actions.length;i++) 
     { 
      sb.append("&actions="); 
      sb.append(actions[i]); 

      sb.append("&ticketcategory="); 
      sb.append(category[i]); 
     } 

     return sb.toString(); 
    } 

    protected InputStream getData(String[] actions, String[] category) throws Exception 
    { 
     URI uri = new URI(makeUrlString(actions, category)); 

     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(uri); 
     request.addHeader("Accept-Encoding","gzip"); 
     HttpResponse response = client.execute(request); 
     InputStream content = response.getEntity().getContent(); 
     Header contentEncoding = response.getFirstHeader("Content-Encoding"); 

     if (contentEncoding != null && contentEncoding.getValue().equalsIgnoreCase("gzip")) 
     { 
      content = new GZIPInputStream(content); 
     } 

     return content; 
    } 

    @Override 
    protected void onPostExecute(String jsonString) 
    { 
     result = jsonString; 
    } 
} 

private class jsonParser extends BaseParser 
{ 
    public jsonParser() 
    { 
     super("json"); 
    } 

    @Override 
    protected String doInBackground(String... actions) 
    { 
     String[] category = new String[] {"Open"}; 

     StringBuilder json = null; 
     try 
     { 
      json = new StringBuilder(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(getData(actions, category))); 
      String line = reader.readLine(); 

      while (line != null) 
      { 
       json.append(line); 
       line = reader.readLine(); 
      } 
     } 
     catch (Exception e) 
     { 
      Log.e("PrimeCMDB - Network", "Exception getting JSON data", e); 
     } 

     return json.toString(); 
    } 
} 

/** 
* Class for clients to access. Because we know this service always 
* runs in the same process as its clients, we don't need to deal with 
* IPC. 
*/ 
public class LocalBinder extends Binder 
{ 
    public TicketConnector getService() 
    { 
     return TicketConnector.this; 
    } 
} 
} 

這是在AndroidManifest.xml的兩個活動:

<activity 
    android:name=".ticket.TicketList" 
    android:label="@string/ticket" 
/> 
<service 
    android:name=".network.TicketConnector" 
    android:enabled="true" 
/> 

onServiceConnected永遠不會執行。我錯過了什麼?

這裏是logcat的在詳細模式輸出,同時激活TicketList活動:

09-28 23:22:11.420: INFO/ActivityManager(795): Starting activity: Intent { cmp=org.mw88.cmdb/.gui.TicketListActivity } 
09-28 23:22:12.340: WARN/ActivityManager(795): Binding with unknown activity: [email protected] 
09-28 23:22:16.090: INFO/ActivityManager(795): Displayed activity org.mw88.cmdb/.gui.TicketListActivity: 4606 ms (total 4606 ms) 
+0

您的'onCreate()'方法是否完成? – Falmarri 2010-09-28 19:08:38

+0

是的,onCreate()方法TicketList完成,但我只注意到該服務似乎根本沒有連接。它的onCreate()方法永遠不會執行:( – mw88 2010-09-28 19:27:57

+0

在Eclipse中使用'adb logcat',DDMS或DDMS透視圖來檢查LogCat。很可能,那裏有一條消息(警告或錯誤),它會告訴你什麼 – CommonsWare 2010-09-28 20:43:36

回答

9

謝謝大家對你的答案。

我發現這個問題該日誌消息穀歌搜索後:

Binding with unknown activity: android.os.BinderProxy 

看來,Android有一個bug使用bindService來一補則tabspec活動時!

的解決方案是非常簡單的: 只需更換bindServicegetApplicationContext()bindService

現在它完美;-)

+0

呃......他們應該在某處記錄下來 – 2011-04-05 12:02:27

0

我不認爲這是一個錯誤。

在我看來,這是因爲當您使用TabActivity時,子活動將嵌入父代(TabActivity)中,就像活動行爲的視圖一樣,因此其上下文不能用作實際上下文。

所以對於解決辦法,你需要獲得和使用父(使用的getParent()),或者它可以作爲一個「實際的」上下文行動應用程序上下文(使用getApplicationContext())。

但是,這只是我的意見,因爲我無法提供任何與此相關的任何文檔的鏈接。 :)

相關問題