2015-04-01 97 views
-1

我有一個包含Asynctask和Handler類的服務。 AsyncTask和Handler應該共享一個變量。我使用靜態易失性變量isSendMessage,因爲我認爲有兩個線程,但我不確定。問題在於while循環中的變量不會改變。我不知道我的錯誤在哪裏。這是我的代碼片段。Asynctask和Handler類 - 不能共享變量

public class Services extends Service { 

    static volatile boolean isSendMessage = false; 

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

    @Override 
     public int onStartCommand (Intent intent, int flags, int startId) { 
      new ConnectionServerAsyncTask().execute(); 
      return Service.START_STICKY; 
    } 

    public class ConnectionServerAsyncTask extends AsyncTask<Void, Result, Void> { 
    private boolean finish = false; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     while(!finish){ 
     Log.i("isSendMessage",String.valueOf(isSendMessage)); 
      } 
    } 

     @Override 
    protected void onPostExecute(Void aVoid) { 
     super.onPostExecute(aVoid); 
    } 

    } 

    public static class MessageHandler extends Handler{ 

      @Override 
      public void handleMessage(Message msg) { 
       Log.i("MessageHandler","handleMessage"); 
       isSendMessage = true;    
      } 
     } 


    } 

回答

0

onPostExecute()自動使用UI線程,因此實際上並不需要將處理程序與異步任務結合使用。只需編寫你想在其中執行的代碼就像你在其他地方一樣。

對於while循環(!finish),我沒有看到任何地方完成設置爲true。

+0

Asynctask類用於連接到服務器。我需要處理程序,因爲我想從活動發送數據到服務,並且服務Asynctask將數據發送到服務器。 – 1Jo1 2015-04-01 14:20:23

+0

您可以在活動的頂部聲明靜態布爾isSendMessage = false作爲全局變量。這應該允許它被共享。它的工作原理是 – scubasteve623 2015-04-01 14:26:21

+0

。謝謝。我的錯誤是該服務有一個自己的過程... – 1Jo1 2015-04-01 14:58:54

0

嘗試刪除靜態易失性。 將其替換爲boolean isSendMessage = false;

+0

它不起作用,因爲變量必須是靜態的 – 1Jo1 2015-04-01 14:16:46