2013-08-27 129 views
1

我已經使用定時器在特定時間段後調用某些功能。定時器在android不調用函數

我已經做到了與下面的代碼段:

Timer myTimer = new Timer(); 
     myTimer.schedule(new TimerTask() {   
      public void run() { 
       Toast.makeText(getApplicationContext(),"Insidedsfdsf Click " , Toast.LENGTH_LONG).show(); 
       UpdateTask(); 
      } 
    }, 1, 1000); 




public void UpdateTask() { 
      // TODO Auto-generated method stub 
      try 
      { 


       Toast.makeText(getApplicationContext(),"update " , Toast.LENGTH_LONG).show(); 



      Intent intent = getIntent(); 

      String message = intent.getStringExtra(MainActivity.EXTRA_MESSAGE); 
      String id = intent.getStringExtra(MainActivity.EXTRA_ID); 
      String[] lst = null; 
      String[] lstNew = null; 
      ListView lm=(ListView)findViewById(R.id.listView1); 
      TextView tv = (TextView)findViewById(R.id.textView1); 
      TextView tvNewMessages = (TextView)findViewById(R.id.tvNewMessages); 

      tv.setText("Welcome " + message); 



      CallSoap cs=new CallSoap(); 



      lst=cs.GetMessage(id); 

      lstNew=cs.GetNewMessage(id); 



      final int numOfMessages=lstNew.length; 

      //Toast.makeText(getApplicationContext(),"Call "+lstNew.length , Toast.LENGTH_LONG).show(); 





      tvNewMessages.setText("You have "+ numOfMessages +" new messages"); 

      ArrayAdapter<String> adpt = new ArrayAdapter<String>(Messages.this, android.R.layout.simple_list_item_1,lst){ 
       @Override 
       public View getView(int position, View convertView, ViewGroup parent) { 
        View v = super.getView(position, convertView, parent); 

        if(position<numOfMessages){ 
         v.setBackgroundColor(Color.RED); 
         } 
        else 
        { 
        v.setBackgroundColor(Color.WHITE); 
        } 
        return v; 
       } 
      }; 

      lm.setAdapter(adpt); 

      } 
      catch(Exception ex) 
      { 
       ex.printStackTrace(); 
       //Toast.makeText(getApplicationContext(),"Call "+ex.getMessage() , Toast.LENGTH_LONG).show(); 
      } 
     } 

,但我發現我的UpdateTask功能是沒有得到調用,並在logcat中其顯示我的錯誤:

can't create handler inside thread 

請幫助我。

+0

你不能從TimerTask的更新UI。你應該使用runonUiThread。搜索相關答案 –

+1

請爲大家着想,不要輪詢新消息。相反,讓Android在新消息到達時告訴你,以防你正在尋找新的短信。 http://stackoverflow.com/questions/4117701/android-sms-broadcast-receiver或者如果這是一些其他的自定義消息,然後使用GCM。 –

回答

2

計時器任務在不同的線程上運行。 Ui應該在ui線程上更新。因此您可以使用Handler。或使用runOnUiThread

Handler m_handler; 
Runnable m_handlerTask ; 
m_handler = new Handler(); 
m_handlerTask = new Runnable() 
{ 
    @Override 
    public void run() { 

    // do something 
    m_handler.postDelayed(m_handlerTask, 1000);  

    } 
    }; 
m_handlerTask.run(); 

還要檢查這個作爲一個側面說明

Android Thread for a timer

編輯:

你每次初始化你的看法。它移動到onCreate,並將其聲明爲類成員

ListView lm=(ListView)findViewById(R.id.listView1); 
    TextView tv = (TextView)findViewById(R.id.textView1); 
    TextView tvNewMessages = (TextView)findViewById(R.id.tvNewMessages); 
+0

但它一直在等待整個應用程序的特定時期 –

+0

@NavatKayAahe我不明白你的要求。你在做什麼? – Raghunandan

+0

我每15-20秒更新數據庫的消息,所以當我使用處理程序時,它是這樣做的,但問題是,它不允許我註銷(註銷我拿走了textview,並點擊了我已編寫代碼,使用戶註銷)...這就是爲什麼我用計時器.. –

1

,你必須使用這樣的:

Handler h = new Handler(); 
Runnable r = new Runnable(){ 

@Override 
    public void run() { 

    //perform action here. 
    h.postDelayed(m_handlerTask, 1000);  

} 
}; 
h.run(); 
1

,或者你可以嘗試CountDownTime

new CountDownTimer(x, x) { 

    public void onTick(long millisUntilFinished) { 
      Toast.makeText(getApplicationContext(),"Insidedsfdsf Click " , Toast.LENGTH_LONG).show(); 
    } 

    public void onFinish() { 
      UpdateTask(); 
    } 
    }.start(); 
相關問題