2011-05-30 38 views
0

搜索關於這個具體問題的詳細信息後,我在這裏嘗試問某人是否有解決方案..Android的 - 問題與線程,監聽和倒計時

我試圖開發一個Android應用程序至極目前一些事件在今天與事件日期之間的倒數計時器的列表視圖中。

我已經在列表視圖中放置了一個「onItemClickListener」,以便詢問用戶他是否想將事件添加到他的列表中。

這是倒計時代碼:

while (countdownActive) {     
    countdownThread = new Thread(new Runnable() { 

     @Override 
    public synchronized void run() { 
    try { 
     this.wait(300); 
     handler.sendEmptyMessage(3); 
    } catch (InterruptedException e) { 
      Log.d("CKUne", e.getMessage()); 
    } 
    } 
}); 

countdownThread.start(); 

問題是,當我點擊一個項目,對話框並不總是顯示。有時它是(可能是因爲主線程有焦點),有時它不是(當countDown線程有焦點時)。

希望你有解決方案來阻止另一個線程。

謝謝

@Geo:這是對話框的機制:)

eventsListView.setOnItemClickListener(新OnItemClickListener({

 @Override 
     public void onItemClick(AdapterView<?> parent, View view, final int position, 
       long id) { 
      ckPosition = position; 

      new addCKTask().execute(null , null , null); 
     } 
    }); 

的addCKTask:

private class addCKTask extends AsyncTask<URL, Integer, Long> { 

     @Override 
     protected Long doInBackground(URL... params) { 
      Log.d("CKUne" , "itemclick"); 
      handler.sendEmptyMessage(5); 

      handler.sendEmptyMessage(4); 

      handler.sendEmptyMessage(2); 

      return null; 
     } 
    } 

然後處理程序:

private Handler handler = new Handler(){ 
     @Override 
     public void handleMessage(Message msg) { 
      switch(msg.what) { 
      case 1 : 
       findViewById(R.id.loadCategoriesProgress).setVisibility(View.VISIBLE); 
       title.setText(categoriesName[indexCategorie].getLibelleCategorie()); 
       break; 
      case 2 : 
       eventsListView.setAdapter(adapter); 

       countdownActive = true; 

       cdTask = new startCountDown(); 
       cdTask.execute(null, null, null); 

       findViewById(R.id.loadCategoriesProgress).setVisibility(View.INVISIBLE); 
       break; 
      case 3 : 
       Thread.currentThread().interrupt(); 

       adapter.notifyDataSetChanged(); 
       break; 
      case 4 : 
       countdownThread.interrupt(); 

       stopCountDown(); 

       AlertDialog.Builder loginAlert = new AlertDialog.Builder(CKALaUne.this); 

       loginAlert.setMessage("Voulez-vous ajouter " + events.get(ckPosition).getNomCK() + "à votre liste ?"); 

       loginAlert.setPositiveButton("Ajouter", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         chronokifWebServices.AddToMyChronokifs(CKALaUne.this.getIntent().getExtras().getString("pseudonyme"), CKALaUne.this.getIntent().getExtras().getString("password"), (events.get(ckPosition).getIdCK() + "")); 
        } 
       }); 

       loginAlert.setNegativeButton("Annuler", new DialogInterface.OnClickListener() { 
        public void onClick(DialogInterface dialog, int id) { 
         dialog.cancel(); 
        } 
       }); 

       loginAlert.show(); 

       break; 
      case 5 : 
       stopCountDown(); 
       break; 
      } 
     } 
    }; 

在開始的時候,我只用線程和處理程序,但由於錯誤的結果,我試過的AsyncTask,但它給出了相同的結果:當我點擊,有一個機會,點擊不工作,並有機會它的工作原理。

+0

添加您在onItemClickListener()中使用的代碼以使對話框出現 – Geobits 2011-05-30 12:02:13

回答

0

我不確定沒有剩下的代碼,但沒有顯示的對話框可能是由於this.wait(300);因爲凍結了屏幕。另外,如果要停止countDown線程,請使用countdownThread.interrupt();,並確保在catch (InterruptedException e) {塊中包含任何重要操作。

最後,我不知道循環的其餘部分是什麼樣子,但它看起來好像是在while循環的每一次迭代中創建一個新線程,如果是這樣的話 - 可能是線程爲什麼不是不可預測。