2013-02-17 100 views
2

以下代码应访问读取XML并在布局中显示它的网站。 不知何故是不是在我的Android上工作,而在模拟器上它工作正常。 有人能告诉我为什么它不工作,我应该怎么做才能纠正它?HttpSocket无法在我的Android设备上工作

的Java:

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
} 
public void connect (View v){ 
    TextView mTextView = (TextView) findViewById(R.id.textView1); 

     try { 
      Socket mySocket = new Socket("www.ynet.co.il", 80); 
      InputStream in = mySocket.getInputStream(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 

      String line = ""; 
      String output = ""; 
      while ((line = reader.readLine()) != null) { 
       output += line; 
      } 
      mTextView.setText(output); 

     } catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

} 

public void good (View v){ 
     TextView mTextView = (TextView) findViewById(R.id.textView1); 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet("http://www.boi.org.il/currency.xml?curr=01"); 

     try { 
      HttpResponse response = client.execute(request); 
      HttpEntity entity = response.getEntity(); 
      InputStreamReader in = new InputStreamReader(entity.getContent()); 
      BufferedReader reader = new BufferedReader(in); 

      String line = ""; 
      String output = ""; 
      while ((line = reader.readLine()) != null) { 
       output += line; 

       if (line.contains("RATE")) { 
        StringTokenizer tokens = new StringTokenizer(line,"><"); 
        String token = tokens.nextToken(); 
        String token1 = tokens.nextToken(); 
        String token2 = tokens.nextToken(); 
        mTextView.setText("The USD/ILS Rate is: "+token2); 
       } 
      } 




     } catch (ClientProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
} 
@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

}

这是logcat的:

02-17 17:55:39.165: D/dalvikvm(14064): Late-enabling CheckJNI 
02-17 17:55:39.225: I/dalvikvm(14064): Turning on JNI app bug workarounds for target SDK version 10... 
02-17 17:55:39.280: W/ActivityThread(14064): Application com.example.httpsocket can be debugged on port 8100... 
02-17 17:55:40.905: D/AndroidRuntime(14064): Shutting down VM 
02-17 17:55:40.905: W/dalvikvm(14064): threadid=1: thread exiting with uncaught exception (group=0x410ed2a0) 
02-17 17:55:40.935: E/AndroidRuntime(14064): FATAL EXCEPTION: main 
02-17 17:55:40.935: E/AndroidRuntime(14064): java.lang.IllegalStateException: Could not execute method of the activity 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.view.View$1.onClick(View.java:3691) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.view.View.performClick(View.java:4211) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.view.View$PerformClick.run(View.java:17267) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.os.Handler.handleCallback(Handler.java:615) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.os.Handler.dispatchMessage(Handler.java:92) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.os.Looper.loop(Looper.java:137) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.app.ActivityThread.main(ActivityThread.java:4898) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at java.lang.reflect.Method.invokeNative(Native Method) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at java.lang.reflect.Method.invoke(Method.java:511) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at dalvik.system.NativeStart.main(Native Method) 
02-17 17:55:40.935: E/AndroidRuntime(14064): Caused by: java.lang.reflect.InvocationTargetException 
02-17 17:55:40.935: E/AndroidRuntime(14064): at java.lang.reflect.Method.invokeNative(Native Method) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at java.lang.reflect.Method.invoke(Method.java:511) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.view.View$1.onClick(View.java:3686) 
02-17 17:55:40.935: E/AndroidRuntime(14064): ... 11 more 
02-17 17:55:40.935: E/AndroidRuntime(14064): Caused by: android.os.NetworkOnMainThreadException 
02-17 17:55:40.935: E/AndroidRuntime(14064): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1118) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at java.net.InetAddress.getAllByName(InetAddress.java:214) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:670) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:509) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
02-17 17:55:40.935: E/AndroidRuntime(14064): at com.example.httpsocket.MainActivity.good(MainActivity.java:63) 
02-17 17:55:40.935: E/AndroidRuntime(14064): ... 14 more 

回答

0

NetworkOnMainThreadException当您尝试访问网络,即开放的HttpConnection发生在运行Android与API 11设备和更高版本在主线程上。

当应用程序尝试在其主线程上执行联网操作时引发的异常。

这仅适用于针对Honeycomb SDK或 的应用程序。针对早期SDK版本的应用程序允许在其主要事件循环线程上执行联网,但不鼓励 。

因此它适用于您的模拟器,因为它很可能具有小于11的API,并且您的设备具有更新的API。

要解决它使用AsyncTask或网络连接的专用线程,see this question

相关问题