使用eclipse从网页获取源代码时出错

时间:2014-01-03 20:14:14

标签: java android

我在网上发现我们可以使用HttpClient和HttpGet对象使用java下载页面的源代码。但是,每当我尝试这样做时,我的IDE(Eclipse)都要求我用try / catch块包围一些代码行,除非我这样做,否则它不会编译。但话说回来,当我用try / catch块包围这些行时,一些变量超出了范围而引发了另一个错误。 这是正在发生的事情 -

package com.example.prs;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
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.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class PrsActivity extends Activity {

private TextView title;
private String url = "http://www.google.com";
private String pageHtml;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_prs); 
    title = (TextView) findViewById(R.id.title); 
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
    HttpResponse response = client.execute(request); // asks to add try/catch block here

    String html = "";
    InputStream in = response.getEntity().getContent(); //asks to add try/catch block here
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder str = new StringBuilder();
    String line = null;
    while((line = reader.readLine()) != null)     // asks to add try/catch block here
    {
        str.append(line);
    }
    in.close(); // asks to add try/catch block here
    html = str.toString();
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_prs, menu);
    return true;
    }
  }

当我添加try / catch块时,会出现这些错误 -

package com.example.prs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class PrsActivity extends Activity {

private TextView title;
private String url = "http://www.google.com";
private String pageHtml;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_prs); 
    title = (TextView) findViewById(R.id.title); 
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(url);
    HttpResponse response;
    try {
        response = client.execute(request);
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    String html = "";
    InputStream in;
    try {
        in = response.getEntity().getContent();     //"response" goes out of scope
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder str = new StringBuilder();
    String line = null;
    try {
        while((line = reader.readLine()) != null)
        {
            str.append(line);
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    try {
        in.close();     //"in" goes out of scope
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    html = str.toString();
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu`enter code here`.activity_prs, menu);
    return true;
   }
 }

请帮我解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

纯粹作为语法问题,以下是修复异常问题的方法:

package com.example.prs;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

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.os.Bundle;
import android.util.Log;
import android.widget.TextView;

public class PrsActivity extends Activity {

    private TextView title;
    private String url = "http://www.google.com";
    private String pageHtml;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_prs);
        title = (TextView) findViewById(R.id.title);
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);

        try {
            HttpResponse response = client.execute(request); // asks to add
                                                                // try/catch
                                                                // block here

            String html = "";
            InputStream in = response.getEntity().getContent(); // asks to add
                                                                // try/catch
                                                                // block here
            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(in));
            StringBuilder str = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) // asks to add try/catch
                                                        // block here
            {
                str.append(line);
            }
            in.close(); // asks to add try/catch block here
            html = str.toString();
        } catch (IOException err) {
            Log.e(PrsActivity.class.getSimpleName(), err.toString(), err);
        }
    }
}

然而,正如邹邹在评论中指出的那样,这仍然无效,因为你试图在主线程中执行网络请求。您需要创建AsyncTask并在那里执行网络请求。

请参阅this answer,了解如何创建AsyncTask