2014-12-06 80 views
0

我正在创建一个应用程序,它从json中的服务器获取homestatus,但是这发生在另一个线程上。当我尝试在UI上设置大多数项时,这不是问题,因为我可以将它们设置为静态无效。但是当我尝试创建一个新的开关和空间时,我无法调用'this'来创建一个新的。来自其他线程的Android UI

用于获取homestatus

代码:

public void loadHomeStatus() 
{ 
    if(socket != null) {`enter code here` 
     if (socket.isConnected()) { 
      Log.d("BtnUpdate","already connected"); 
      return; 
     } 
    } 

    swAlarm = (Switch) findViewById(R.id.swAlarmState); 
    tvTemperature = (TextView) findViewById(R.id.tvTemprateur); 
    tvHumidity = (TextView) findViewById(R.id.tvHumidity); 
    llDevices = (LinearLayout) findViewById(R.id.llDevices); 

    new Thread() { 
     public void run() { 
      try 
      { 
       busyConnecting = true; 
       Log.d("loadHomeStatus","trying to connect to: " + host + ":" + port); 
       socket = new Socket(host, port); 
       uiConnected(); 

        Log.d("loadHomeStatus","Connected"); 
        DataOutputStream os = new DataOutputStream(socket.getOutputStream()); 
        DataInputStream is = new DataInputStream(socket.getInputStream()); 


        os.writeBytes(password); 
        Log.d("Connect", "send: " + password); 
       while (socket.isConnected()) { 
        byte[] data = new byte[500]; 
        int count = is.read(data); 
        String recieved = new String(data).trim(); 
        Log.d("loadHomeStatus","recieved " + recieved); 
        if(recieved.toLowerCase() == "failed") 
        { 
         Log.d("loadHomeStatus","failed to log in"); 
        } 
        else 
        { 
         try 
         { 
          homeStatus = new Gson().fromJson(recieved, HomeStatus.class); 
          uiLoadStatus(); 
         } catch (Exception e) 
         { 
          Log.d("Error", e.toString()); 
         } 
        } 
       }//end of while loop 

       Log.w("loadHomeStatus", "end connection thread "); 
       //ends thread 
       Thread.currentThread().interrupt(); 
       return; 
      } 
      catch (UnknownHostException e) 
      { 
       e.printStackTrace(); 
       Log.w("loadHomeStatus", "no Failed to connect: " + host + "-" + 8001); 
      } 
      catch (IOException e) 
      { 
       e.printStackTrace(); 
       Log.w("loadHomeStatus", "no Failed to connect: " + host + "-" + 8001); 
      } 
      Log.w("loadHomeStatus","Connection ended"); 
      socket = null; 
      busyConnecting = false; 
      uiDisconnected(); 
     } 
    }.start(); 
}` 

代码设置UI

public static void uiLoadStatus() 
{ 
    if (homeStatus != null) 
    { 
      try { 

       tvTemperature.post(new Runnable() 
       { 
        public void run() 
        { 
         //Log.d("uiLoadStatus to string",homeStatus.toString()); 

         tvTemperature.setText(homeStatus.temperature + "°C"); 
         tvHumidity.setText(homeStatus.humidity + "%"); 
        } 
       }); 
     } 
     catch(Exception e) 
     { 
      Log.d("uiLoadStatus status fragment", e.toString()); 
     } 


     try { 
      swAlarm.post(new Runnable() 
      { 
       public void run() { 
        swAlarm.setChecked(homeStatus.alarmState); 
       } 
      }); 
     } 
     catch (Exception e) 
     { 
      Log.d("uiLoadStatus alarm fragment", e.toString()); 

     } 
    } 
    try { 
     llDevices.post(new Runnable() 
     { 
      public void run() { 
       uiLoadDevices(); //this gives and error because it's not static 
      } 
     }); 
    } 
    catch (Exception e) 
    { 
     Log.d("uiLoadStatus alarm fragment", e.toString()); 

    } 
} 


public void uiLoadDevices() 
{ 
    for (int i = 0; i < homeStatus.lstDevices.size(); i++) { 

     String deviceAdd = homeStatus.lstDevices.get(i); 
     Space mySpace = new Space(this); 
     Switch mySwitch = new Switch(this); 

     mySpace.setMinimumHeight(50); 
     mySwitch.setText(homeStatus.getName(deviceAdd)); 
     mySwitch.setChecked(homeStatus.getState(deviceAdd)); 
     mySwitch.setTextSize(18); 

     LinearLayout.LayoutParams lp = new   LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,  LinearLayout.LayoutParams.WRAP_CONTENT); 
     lp.gravity = Gravity.LEFT; 

     llDevices.addView(mySpace, lp); 
     llDevices.addView(mySwitch, lp); 
    } 
} 
+0

你看看AsyncTask,它的三个原因是这个原因 – nPn 2014-12-06 15:17:08

回答

0

您应该使用AsyncTask并将网络交互部分放在doInBackground()方法中。要更新UI组件,在onPostExecute()方法中实现这些逻辑

+0

我会试试这个。这似乎是更好的做法 – 2014-12-06 15:18:59

0

uiLoadStatus是一个静态方法(不知道为什么,或者如果它必须不看所有的代码),因此你不能调用其中的非静态方法,如uiLoadDevices

我建议看看你的代码并更新你的uiLoadStatus如果可能的话不要是静态的。滥用静态会导致代码冗长。