Android无法执行Http get或post请求

时间:2013-01-18 13:24:06

标签: android

我正试图从互联网上的一个教程中执行一个非常简单的例子。但是不能执行。它给我带来了向服务器发送http get请求的例外....代码运行良好,直到它发送请求到服务器。

HttpExample类:

    public class HttpExample extends Activity {

        TextView httpStuff;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.httpex);
            httpStuff = (TextView) findViewById(R.id.tvHttp);
            GetMethodEx test = new GetMethodEx();
            String returned;
            try {
                returned = test.getInternetData();
                httpStuff.setText(returned);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                Toast.makeText(HttpExample.this, "Failed", Toast.LENGTH_LONG)
                        .show();
            }

        }

        public class GetMethodEx {

            public String getInternetData() throws Exception {
                BufferedReader in = null;
                String data = null;
                try {
                    HttpClient client = new DefaultHttpClient();
                    URI website = new URI("http://www.mybringback.com/");
                    HttpGet request = new HttpGet();
                    request.setURI(website);
                    HttpResponse response = client.execute(request);
                    // Toast.makeText(HttpExample.this, "Here",
                    // Toast.LENGTH_LONG).show();

                    in = new BufferedReader(new InputStreamReader(response
                            .getEntity().getContent()));
                    StringBuffer sb = new StringBuffer("");
                    String l = "";
                    String nl = System.getProperty("line.separator");
                    while ((l = in.readLine()) != null) {
                        sb.append(l + nl);
                    }
                    in.close();
                    data = sb.toString();
                    return data;
                } finally {
                    if (in != null) {
                        try {
                            in.close();
                            return data;
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                }
            }

        }

    }

Android Manifest.xml :我还启用了Internet权限

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.httpclient"
        android:versionCode="1"
        android:versionName="1.0" >

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

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

        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name="com.example.httpclient.HttpExample"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />

                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>

    </manifest>

我不知道这是什么问题,因为我已经运行了很多其他代码来发送或接收来自服务器的数据但他们也没有执行可能是它的模拟器或其他东西的问题... plz指导我这里这是班级代码和清单......

3 个答案:

答案 0 :(得分:1)

选项1:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
 StrictMode.setThreadPolicy(policy);

选项1仅适用于测试它。但是你应该避免使用这种方法来实现它,并为它做一个AsyncTask

// ============================================= ==============================
 选项2:

使用本教程制作正确的ASyncTask:http://www.elvenware.com/charlie/development/android/SimpleHttpGetThread.html

// ============================================= ==============================
 使用ASyncTask作为final(选项2)。

答案 1 :(得分:0)

检查你的logcat输出,它说 NetworkOnMainThreadException ,意味着你在主线程上直接执行长时间运行的任务(web调用)。

为了实现这样长时间运行的任务,您可以实现AsyncTask或线程实现来进行Web调用。

仅供参考,AsyncTask被称为无痛线程,意味着您无需担心任何线程进程。

在方法doInBackground()之一中实施您的网络电话,AsyncTask文档中已经提供了一个示例。

答案 2 :(得分:0)

检查您的设备与互联网的连接。

如果您为textview设置文字,请尝试下载简单文字:http://weather.yahooapis.com/forecastrss?w=2502265