android网络连接失败

时间:2013-09-24 11:45:03

标签: java android network-programming android-manifest

我很难将应用程序连接到互联网并检索html源代码。 一直在寻找一个解决方案,但没有找到。希望有人能提供帮助。 这是我的代码:

public class Main extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        final EditText et = (EditText) findViewById(R.id.editText1);
        final Button b = (Button) findViewById(R.id.button1);
        final TextView tv = (TextView) findViewById(R.id.textView1);

        b.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                try {
                    URL url=null;
                    url = new URL(et.getText().toString());
                    URLConnection conn = url.openConnection();
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(conn.getInputStream()));
                    String line = "";
                    while ((line = reader.readLine()) != null) {
                        tv.append(line);
                    }

                } catch (Exception e) {

                }

            }
        });
    }

我还添加了INTERNET权限..

3 个答案:

答案 0 :(得分:1)

您需要移动连接到互联网的代码并将数据提取到AsyncTask。这是因为NetworkOnMainThreadException。当应用程序尝试在其主线程上执行网络操作时,抛出此异常。

虽然使用StrictMode.ThreadPolicy可以找到解决方法,但最好不要这样做。

以下摘自docs

<强> NetworkOnMainThreadException: -

  

这仅适用于应用程序   针对Honeycomb SDK或更高版本。早期的应用程序   允许SDK版本在其主事件循环上进行联网   线程,但它非常沮丧。

有关详细信息,请参阅this question

答案 1 :(得分:0)

因为你是在UI therad上这样做的。

试试这个:

public class Main扩展Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    final EditText et = (EditText) findViewById(R.id.editText1);
    final Button b = (Button) findViewById(R.id.button1);
    final TextView tv = (TextView) findViewById(R.id.textView1);

    b.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Thread th = new Thread() {
                @Override
                public void run() {
                    try {

                        URL url=null;
                        url = new URL(et.getText().toString());
                        URLConnection conn = url.openConnection();
                        BufferedReader reader = new BufferedReader(
                        new InputStreamReader(conn.getInputStream()));
                        String line = "";
                        while ((line = reader.readLine()) != null) {
                        tv.append(line);
                    }

                } catch (Exception e) {

                }
            }
        };
        th.start();
        }
    });
}

答案 2 :(得分:0)

我建议您使用AsyncTask

这样做

ButtonClick

RequestClient reqClient = new RequestClient(ActivityName.this);
String AppResponse = null;
AppResponse = reqClient.execute().get();

RequestClient

public class RequestClient extends AsyncTask<String, Void, String> {
    Context context;

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

    }

    @Override
    protected String doInBackground(String... params) {
        try {
            HttpClient httpclient = new DefaultHttpClient(); // Create HTTP Client
            HttpGet httpget = new HttpGet("http://yoururl.com"); // Set the action you want to do
            HttpResponse response = httpclient.execute(httpget); // Executeit
            HttpEntity entity = response.getEntity(); 
            InputStream is = entity.getContent(); // Create an InputStream with the response
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) // Read line by line
            sb.append(line + "\n");

            String resString = sb.toString(); // Result is here

            is.close(); // Close the stream
            } catch (Exception e) {
            Log.d("ANDRO_ASYNC_ERROR", "Error is " + e.toString());
        }
        Log.d("ANDRO_ASYNC_RESPONSE", responseString.trim());
        client.getConnectionManager().shutdown();
        return responseString.trim();
    }

    @Override
    protected void onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);

    }
}