在Eclipse Debugger中运行我的Android App时,我有一个通知的服务。在调试器之外,它不发送通知

时间:2011-01-26 16:43:30

标签: android android-service

我正在创建一个向状态栏发送通知的应用程序,它会在单步执行调试器中的代码时发送通知,但它在实时运行时从不发送通知。

这是我的runnable生成通知,再次在调试器中单步执行此代码时,通知会运行,但实时没有任何反应。

public class NewsEvents_Service extends Service {
    private static final String NEWSEVENTS = "newsevents";
    private static final String KEYWORDS = "keywords";
    private NotificationManager mNM;
    private ArrayList<NewsEvent> neList;
    private int count;

    @Override
    public void onCreate() {
        mNM = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
        neList = new ArrayList<NewsEvent>();
        getKeywords();
        //getNewsEvents();

        Thread thr = new Thread(null, mTask, "NewsEvents_Service");
        thr.start();
        Log.d("Thread", "IT STARTED!!!!!!????!!!!!!!!!!!!!!!?!!?");
    }

    @Override
    public void onDestroy() {
        // Cancel the notification -- we use the same ID that we had used to start it
    mNM.cancel(R.string.ECS);
        // Tell the user we stopped.
        Toast.makeText(this, "Service Done", Toast.LENGTH_SHORT).show();
    }

    /**
     * The function that runs in our worker thread
     */
    Runnable mTask = new Runnable() {
        public void run() {
        getNewsEventsFromWeb();
    for(NewsEvent ne : neList){
            Log.d("Thread Running", "Service Code running!!!!!!!!!!!!!!!");

            String body = ne.getBody().replaceAll("\\<.*?>", "");
            String title = ne.getTitle();
            for(String s : keyWordList){
                if(body.contains(s) || body.contains(s.toLowerCase()) ||
                    title.contains(s) || title.contains(s.toLowerCase())){
                ne.setInterested(true);
                }
            }

            if(ne.isInterested() == true ){
                    Notification note = new Notification(R.drawable.icon,
                        "New ECS News Event", System.currentTimeMillis());
                    Intent i = new Intent(NewsEvents_Service.this, FullNewsEvent.class);
                    i.putExtra("ne", ne);
                    PendingIntent pi = PendingIntent.getActivity(NewsEvents_Service.this, 0,
                        i, 0);


                    note.setLatestEventInfo(NewsEvents_Service.this, "New Event", ne.getTitle(), pi);
                    note.flags = Notification.FLAG_AUTO_CANCEL;
                    mNM.notify(R.string.ECS, note);
            }

        }
        }
    };

    @Override
    public IBinder onBind(Intent intent) {
        return mBinder;
    }
    /**
     * Show a notification while this service is running.
     */
    private void getNewsEventsFromWeb() {

    HttpClient client = new DefaultHttpClient();
    HttpGet get;

        try {
                get = new HttpGet(getString(R.string.jsonnewsevents));
            ResponseHandler<String> response = new BasicResponseHandler();
            String responseBody = client.execute(get, response);

            String page = responseBody;
            Bundle data = new Bundle();         
            data.putString("page",page);
            Message msg = new Message();
            msg.setData(data);

            handler.sendMessage(msg);

        }
        catch (Throwable t) {
            Log.d("UpdateNews", "PROBLEMS");
        }
    }

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            String page = msg.getData().getString("page");



            try {  
               JSONArray parseArray = new JSONArray(page);  

               for (int i = 0; i < parseArray.length(); i++) {  
                   JSONObject jo = parseArray.getJSONObject(i);  

                   String title = jo.getString("title");  

                   String body =jo.getString("body");

                   String pd = jo.getString("postDate");  

                   String id = jo.getString("id");


                   NewsEvent ne = new NewsEvent(title, pd , body, id);

                   boolean unique = true;
                   for(NewsEvent ne0 : neList){
                   if(ne.getId().equals(ne0.getId())){
                      unique = false;
                   }else{
                       unique = true;
                   }
                   }

                   if(unique == true){
                   neList.add(ne);
                   }
               }  
              } catch (JSONException e) {  
               // TODO Auto-generated catch block  
               e.printStackTrace();  
              }
        }
    };
    private ArrayList<String> keyWordList;

    public void getNewsEvents(){
    try {
        InputStream fi = openFileInput(NEWSEVENTS);

        if (fi!=null) {
            ObjectInputStream in = new ObjectInputStream(fi);
                    neList = (ArrayList<NewsEvent>) in.readObject();
                    in.close();
        }
    }
    catch (java.io.FileNotFoundException e) {
        // that's OK, we probably haven't created it yet
    }
    catch (Throwable t) {
        Toast
            .makeText(this, "Exception: "+t.toString(), Toast.LENGTH_LONG)
            .show();
    }
    if(neList == null){
        neList = new ArrayList<NewsEvent>();
    }
    }


    public ArrayList<String> getKeywords(){
    try {
        InputStream fi = openFileInput(KEYWORDS);

        if (fi!=null) {
            ObjectInputStream in = new ObjectInputStream(fi);
                    keyWordList = (ArrayList<String>) in.readObject();
                    in.close();
        }
    }
    catch (java.io.FileNotFoundException e) {
        // that's OK, we probably haven't created it yet
    }
    catch (Throwable t) {
        Toast
            .makeText(this, "Exception: "+t.toString(), Toast.LENGTH_LONG)
            .show();
    }
    if(keyWordList == null){
        keyWordList = new ArrayList<String>();
        return keyWordList;
    }

    return keyWordList;
    }

    /**
     * This is the object that receives interactions from clients.  See RemoteService
     * for a more complete example.
     */
    private final IBinder mBinder = new Binder() {
        @Override
        protected boolean onTransact(int code, Parcel data, Parcel reply,
                        int flags) throws RemoteException {
            return super.onTransact(code, data, reply, flags);
        }
    };
}

这是我的活动,安排服务运行

public class NewsEvents extends ListActivity{
    private URL JSONNewsEvents;
    private ArrayList<NewsEvent> neList;
    private ArrayList<String> keyWordList;
    private Worker worker;
    private NewsEvents ne;
    public static final String KEYWORDS = "keywords";
    private static final String NEWSEVENTS = "newsevents";
    public static final int ONE_ID = Menu.FIRST+1;


    private PendingIntent newsAlarm;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.newsevents);
        ne = this;
        neList = new ArrayList<NewsEvent>();

        try {
        JSONNewsEvents = new URL(getString(R.string.jsonnewsevents));
    } catch (MalformedURLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
        worker = new Worker(handler, this);

        setListAdapter(new IconicAdapter());
        getKeywords(); 
        worker.execute(JSONNewsEvents);
    }

        @Override
    protected void onStop() {
        super.onStop();
        writeNewsEvents() ;
    }

        @Override
    protected void onPause(){
        super.onPause();
        writeNewsEvents();  
    }


    private void writeNewsEvents() {
    try {
        OutputStream fi = openFileOutput(NEWSEVENTS, 0);

        if (fi!=null) {
            ObjectOutputStream out = new ObjectOutputStream(fi);
            out.writeObject(neList);
            out.close();
        }
    }
    catch (java.io.FileNotFoundException e) {
        // that's OK, we probably haven't created it yet
    }
    catch (Throwable t) {
        Toast
            .makeText(this, "Exception: "+t.toString(), Toast.LENGTH_LONG)
            .show();
    }

    }
    /**
     * @return
     */

    public ArrayList<String> getKeywords(){
    try {
        InputStream fi = openFileInput(KEYWORDS);

        if (fi!=null) {
            ObjectInputStream in = new ObjectInputStream(fi);
                    keyWordList = (ArrayList<String>) in.readObject();
                    in.close();
        }
    }
    catch (java.io.FileNotFoundException e) {
        // that's OK, we probably haven't created it yet
    }
    catch (Throwable t) {
        Toast
            .makeText(this, "Exception: "+t.toString(), Toast.LENGTH_LONG)
            .show();
    }
    if(keyWordList == null){
        keyWordList = new ArrayList<String>();
        return keyWordList;
    }

    return keyWordList;
    }

    public void onListItemClick(ListView parent, View v,
        int position, long id) {
    startFullNewsEvent(neList.get(position));
    }

    /**
     * @param newsEvent
     */
    public void startFullNewsEvent(NewsEvent ne) {
    Intent intent = new Intent(this, FullNewsEvent.class);
    intent.putExtra("ne", ne);
    this.startActivity(intent);
    finish();
    }



    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            String page = msg.getData().getString("page");



            try {  
               JSONArray parseArray = new JSONArray(page);  

               for (int i = 0; i < parseArray.length(); i++) {  
                   JSONObject jo = parseArray.getJSONObject(i);  

                   String title = jo.getString("title");  

                   String body =jo.getString("body");

                   String pd = jo.getString("postDate");  

                   String id = jo.getString("id");


                   NewsEvent ne = new NewsEvent(title, pd , body, id);

                   boolean unique = true;
                   for(NewsEvent ne0 : neList){
                   if(ne.getId().equals(ne0.getId())){
                      unique = false;
                   }else{
                       unique = true;
                   }
                   }

                   if(unique == true){
                   neList.add(ne);
                   }
               }  
              } catch (JSONException e) {  
               // TODO Auto-generated catch block  
               e.printStackTrace();  
              }
              ne.setListAdapter(new IconicAdapter());

        }
    };

    public class IconicAdapter extends ArrayAdapter<NewsEvent> {
    IconicAdapter() {
        super(NewsEvents.this, R.layout.rownews, neList);
    }

    public View getView(int position, View convertView,ViewGroup parent) {
        LayoutInflater inflater=getLayoutInflater();

        View row=inflater.inflate(R.layout.rownews, parent, false);
        TextView label=(TextView)row.findViewById(R.id.label);
        ImageView image= (ImageView)row.findViewById(R.id.icon);

        String body = neList.get(position).getBody();
        body.replaceAll("\\<.*?>", "");
        String title = neList.get(position).getTitle();
        for(String s : keyWordList){
            if(body.contains(s) || body.contains(s.toLowerCase()) ||
                title.contains(s) || title.contains(s.toLowerCase())){
            neList.get(position).setInterested(true);
            }
        }

        if(neList.get(position).isInterested() == true){
            image.setImageResource(R.drawable.star);
        }


        label.setText(neList.get(position).getTitle());

        return(row);
    }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        populateMenu(menu); 
        return(super.onCreateOptionsMenu(menu));
    }

@Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return(applyMenuChoice(item) || super.onOptionsItemSelected(item));
    }

    //Creates our activity to menus
    private void populateMenu(Menu menu) { 
        menu.add(Menu.NONE, ONE_ID, Menu.NONE, "Home");

    }

    private boolean applyMenuChoice(MenuItem item) { 
        switch (item.getItemId()) {

        case ONE_ID: startHome(); return(true);

        }
    return(false);
    }
    public void startHome() {
        Intent intent = new Intent(this, ECS.class);
        this.startActivity(intent);
        finish();
    }

}

1 个答案:

答案 0 :(得分:0)

竞争条件,我正在制作HTTP请求,然后将其交给处理程序,紧接着我通过数组列表迭代,因为HTTP尚未完成,所以全速是空的。在调试时,它们都会变慢,因此HTTP已经完成并且一切正常。 线程和网络连接,这是一种致命的组合。