Android HTTP GET不起作用

时间:2013-08-07 17:21:49

标签: android httpclient

我认识Java但不幸的是选择了Basic4Android用于Android开发。工作了一年后,我意识到我应该采用原生解决方案。所以我的问题可能很愚蠢,但我需要你的建议来解决它。

我的目标是从GET请求中检索数据。我已经通过互联网尝试了大量的Android http客户端教程,但每个教程都失败了。我只想在这里分享一个,这样你就可以帮我修复。当我点击按钮时,没有任何事情发生,如果没有logcat窗口中的大量错误消息。

Main Class可在此快速查看:

public class MainActivity extends Activity implements OnClickListener {

    private Button Test;

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

        Test = (Button) findViewById(R.id.Test);
        Test.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.Test){
            try {
                HttpClient client = new DefaultHttpClient();  
                String getURL = "http://www.google.com";
                HttpGet get = new HttpGet(getURL);
                HttpResponse responseGet = client.execute(get);  
                HttpEntity resEntityGet = responseGet.getEntity();  
                if (resEntityGet != null) {  
                    // do something with the response
                    String response = EntityUtils.toString(resEntityGet);
                    Log.i("GET RESPONSE", response);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            }
        }
    }

整个项目在这里:https://dl.dropboxusercontent.com/u/15625012/TestHttp.zip

我真的很感激任何帮助/建议。

3 个答案:

答案 0 :(得分:1)

首先 - 总是在这里发布logcat中的错误,我们几乎总是需要它们来解决问题。

但是这里很容易 - 你不能在主线程上做网络IO。您需要在AsyncTask或Thread上运行它。

答案 1 :(得分:1)

    try {
        URL url = new URL(urlstr);
        HttpsURLConnection connection = 
                  (HttpsURLConnection)url.openConnection();
        connection.setReadTimeout(6000);
        connection.setRequestMethod("GET");
        connection.setRequestProperty("User_agent", "android");
        OutputStream os = connection.getOutputStream();
        //os.write(buffer);

        InputStream is = connection.getInputStream();

    } catch (MalformedURLException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }catch (Exception e) {
        // TODO: handle exception
    }

答案 2 :(得分:1)

您当前正在主UI线程中执行网络访问(按钮单击功能)。 Android不允许在应用程序的主线程UI线程中进行网络访问等长时间操作。您需要在单独的线程中异步执行此操作。您可以使用内置的异步类来实现此目的。

以下是我编写的示例代码

public class Sample extends Activity 
{   
private ProgressDialog progress_dialog;

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

    progress_dialog = new ProgressDialog(this);
}

public void MyButtonClick(View view)
{
        EditText usernameEditText = (EditText)findViewById(R.id.sample_username);
        String username = usernameEditText.getText();

        String URL = "http://SOME_WEBSITE?Username=" + username;

        progress_dialog.setMessage("Loading. Please wait...");
    progress_dialog.setCancelable(false);
    progress_dialog.show();

    new SampleAsynThread().execute(URL);
}

private class SampleAsynThreadextends AsyncTask <String, Void, String> 
{
        protected String doInBackground(String... urls)
        {
            // make your request here
            return "Response";
        }

        protected void onPostExecute(String result) 
        { 
            // show response on ui   
            progress_dialog.dismiss();
        }
    }

protected void onDestroy()
{
    progress_dialog.dismiss();
    super.onDestroy();
}

@Override
protected void onPause()
{
    progress_dialog.dismiss();
    super.onPause();
}

}