2015-04-01 98 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