2015-05-26 40 views
-1

我使用XBMC android源代码,现在尝试提取一些代码到新的xbmc android项目。当我尝试连接到一个IP地址,并检查它是否可以使用isReachable(),它是抛出一个NetworkOnMainThreadException但相同的源代码(在XBMC源代码,我从git downloded)它工作正常, 这是源代码我工作isReachable在android工作室不工作

Handler handler = new Handler(){ 
      public void handleMessage(android.os.Message message){ 
       if(message.getData().containsKey(MacAddressResolver.MESSAGE_MAC_ADDRESS)){ 
        String mac = message.getData().getString(MacAddressResolver.MESSAGE_MAC_ADDRESS); 
        if(!mac.equals("")) { 
         mMacAddrView.setText(mac); 
         Toast toast = Toast.makeText(getContext(), "Updated MAC for host: " + mHostView.getText().toString() + "\nto: " + mac, Toast.LENGTH_SHORT); 
         toast.show(); 
        } 
       } 
      } 
     }; 


public class MacAddressResolver implements Runnable{ 

private String mHost = null; 
private String mMac = null; 
private Handler mHandler; 

public static final String MESSAGE_MAC_ADDRESS = "MAC_ADDRESS"; 

public MacAddressResolver(String ipString, Handler handler){ 
    mHost = ipString; 
    mHandler = handler; 
} 

public void run(){ 
    mMac = arpResolve(mHost); 
    Bundle bundle = new Bundle(); 
    bundle.putString(MESSAGE_MAC_ADDRESS, mMac); 
    Message message = new Message(); 
    message.setData(bundle); 
    mHandler.sendMessage(message); 
} 

private String arpResolve(String host){ 
    System.out.println("ARPRESOLVE HOST: " + host); 
    try{ 
     //Parse it as a proper InetAddress - it might be a hostname. We don't know yet. 
     InetAddress inet = InetAddress.getByName(host); 

     //initiate some sort of traffic to ensure we get an arp entry (if we're on same subnet, that is...) 
     inet.isReachable(500); //timeout of 500ms. just to trigger the arp resolution process 

     //Get the official string representation of the resolved ip address 
     String ipString = inet.getHostAddress(); 
     BufferedReader br = new BufferedReader(new FileReader("/proc/net/arp")); 
     String line = ""; 
     while(true){ 
      line = br.readLine(); 
      if (line == null) 
       break; 
      if(line.startsWith(ipString)){ 
       br.close(); 
       System.out.println("ARPRESOLVE MAC:\n" + line); 
       return line.split("\\s+")[3]; // 4th word, separated by "whitespace" 
      } 
     } 
     br.close(); 
     return ""; 

    }catch(Exception e){ 

     return ""; 
    } 

} 

}

,我也把这两个权限在我的AndroidManifest.xml文件

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="13" /> 

<uses-permission android:name="android.permission.INTERNET" /> 
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

我不知道,是什么问题我该如何解决它?

回答

2

NetworkOnMainThreadException exception意味着你正在做的一些MainThreadNetworking Work(这将重载Thread并抛出一个Exception)。

因此,您必须将Networking Code移动到Background Thread(另一个thread,然后是Main Thread)。

AsyncTask 是一个很好的例子来处理这种事