Android - HttpClient错误

时间:2014-01-18 17:59:00

标签: android httpclient

我正在尝试获取网页内容

HttpClient client = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.google.com");
HttpResponse response = client.execute(request);

“client.execute(request)”被标记为错误,“未处理的异常类型ClientProtocolException” 如何解决这个问题?

编辑

使用Try Catch

try{
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet("http://www.google.com");
    HttpResponse response = client.execute(request);    
}catch(Exception e){
    //Handle Error here
    AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(this);

    dlgAlert.setMessage("OK OK");
    dlgAlert.setTitle("OK");
    dlgAlert.setPositiveButton("OK", null);
    dlgAlert.setCancelable(true);
    dlgAlert.create().show();
}

并运行应用程序,显示警报

互联网连接存在。

添加到androidmanifest.xml的网络使用权限

EDIT 我想获得一个网页内容,我按照教程和previuos问题,我尝试的所有代码都失败了。 完整代码:

package com.example.internetsql;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;


import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;

public class MainActivity extends Activity {

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

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }



public void connect(View view) 
{

    try{
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet("http://www.google.com");
        HttpResponse response = client.execute(request);    
    }catch(Exception e){
        //Handle Error here
        AlertDialog.Builder dlgAlert  = new AlertDialog.Builder(this);

        dlgAlert.setMessage("OK OK");
        dlgAlert.setTitle("OK");
        dlgAlert.setPositiveButton("OK", null);
        dlgAlert.setCancelable(true);
        dlgAlert.create().show();
    }





}



}

2 个答案:

答案 0 :(得分:0)

您需要使用try / catch块包围代码,或者将throws声明添加到调用它的任何方法中。

答案 1 :(得分:0)

您需要从正在执行此方法的方法中抛出ClientProtocolException。或者用try,catch块来围绕它来处理方法本身的预期。

try
{
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet("http://www.google.com");
    HttpResponse response = client.execute(request);
}
catch (ClientProtocolException cpe)
{
    e.printStackTrace();
}

这比捕获一般异常更好,因为你会捕获你可能合理期望获得的异常,但你不会意外地错过你没想到的异常。 (这可能表示代码中存在错误或者您没想到的错误)。

编辑: Android的设置方式不允许您在UI线程中执行可能长时间运行的任务。访问网页通常应该在另一个线程中进行。您将需要研究如何使用AsyncTask。

在此期间,将此代码放在onCreate方法的开头,应暂时解决问题。

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

我强烈建议您在开始尝试在UI线程中执行太多操作之前,先了解如何使用AsyncTask进行Internet访问。这可能在模拟器甚至是连接到Wifi的设备上运行得相当好,但是一旦你进行稍慢的移动连接,你的UI就会在请求运行时变得没有响应。