Android获取网站内容/源代码
我进入项目,需要得到网站的源代码。因此,我从Mark B获得了代码回答: 问题是,HttpClient、HttpGet、HttpResponse现在已被弃用 所以我将其更改为HttpURLConnection,但运气不好,它会强制关闭Android获取网站内容/源代码,android,Android,我进入项目,需要得到网站的源代码。因此,我从Mark B获得了代码回答: 问题是,HttpClient、HttpGet、HttpResponse现在已被弃用 所以我将其更改为HttpURLConnection,但运气不好,它会强制关闭 URL url = new URL("http://google.com"); HttpURLConnection response = (HttpURLConnection) url.openConnection(); String h
URL url = new URL("http://google.com");
HttpURLConnection response = (HttpURLConnection) url.openConnection();
String html = "";
InputStream in = response.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null){
str.append(line);
}
in.close();
html = str.toString();
return html;
这有什么问题?
这是我的追踪
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.listview_load_data_from_json/com.kaleidosstudio.listview_load_data_from_json.MainActivity}: android.os.NetworkOnMainThreadException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2319)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2370)
at android.app.ActivityThread.access$800(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5426)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
at dalvik.system.NativeStart.main(Native Method)
Caused by: android.os.NetworkOnMainThreadException
at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1156)
at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
at java.net.InetAddress.getAllByName(InetAddress.java:214)
at com.android.okhttp.internal.Dns$1.getAllByName(Dns.java:28)
at com.android.okhttp.internal.http.RouteSelector.resetNextInetSocketAddress(RouteSelector.java:216)
at com.android.okhttp.internal.http.RouteSelector.next(RouteSelector.java:122)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:292)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:345)
at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:89)
at com.kaleidosstudio.listview_load_data_from_json.GetMP3.getJSON(GetMP3.java:49)
at com.kaleidosstudio.listview_load_data_from_json.GetMP3.GetMP3_9Cloud(GetMP3.java:34)
at com.kaleidosstudio.listview_load_data_from_json.MainActivity.onCreate(MainActivity.java:52)
at android.app.Activity.performCreate(Activity.java:5296)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2283)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2370)
at android.app.ActivityThread.access$800(ActivityThread.java:155)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1243)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5426)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1268)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1084)
at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:126)
at dalvik.system.NativeStart.main(Native Method)
您正在主线程中调用这些函数。现在,他们有两种可能的方法来解决这个问题
每个线程都有一个整数优先级,它影响操作系统调度线程的方式。新线程继承其父线程的优先级。可以使用setPriority(int)方法设置线程的优先级。这里是一个快速参考您将获得一个
NetworkOnMainThreadException
。这意味着你不能在主UI线程上发送Http请求。你必须在后台线程中完成所有这些
下面是一个简单的示例,说明如何执行此操作:
public class WebsiteDataWorker extends AsyncTask<String, Void, Void> {
public String html;
@Override
private void doInBackground(String... params) {
URL url = params[0];
HttpURLConnection response = (HttpURLConnection) url.openConnection();
String html = "";
InputStream in = response.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null){
str.append(line);
}
in.close();
html = str.toString();
}
}
私有类注册AsyncTask扩展AsyncTask{
进程对话;
@凌驾
受保护的void onPreExecute(){
dialog=新建ProgressDialog(MainActivity.this);
dialog.setTitle(“注册”);
setMessage(“正在注册…”);
对话框。可设置可取消(false);
dialog.show();
}
@凌驾
受保护字符串doInBackground(无效…参数){
试一试{
response=HttpClientWrapper.getResponseGET(“您的url放在这里”);
Log.e(标签“响应:”+响应);
}捕获(例外e){
e、 printStackTrace();
this.error=e.getMessage();
}
返回响应;
}
@凌驾
受保护的void onPostExecute(字符串结果){
Log.e(标签“结果:+响应”);
if(dialog.isShowing()){
dialog.dismise();
}
}}
使用此异步任务
public static String getResponseGET(String url) {
String response = "";
HttpURLConnection c = null;
try {
URL u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setConnectTimeout(15000);
c.setReadTimeout(15000);
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line+"\n");
response = sb.toString().substring(0, sb.toString().length() - 1);
}
br.close();
return response;
}
} catch (IOException ex) {
if (c != null) {
c.disconnect();
}
} finally {
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
}
}
}
return null;}
使用此http调用GET方法您得到的错误是什么?我得到了这个消息。请在问题中发布您的堆栈跟踪。请不要在场外链接到它。它已过时,请在调用后台函数时在execute方法中添加url,然后在后台再次添加method@M.S.P啊!!我忽略了这一点。谢谢你指出它,它迫使我们靠近。我得到一个错误:Rahul,请把你的帖子合并成一个答案。他们看起来像是两个不同的答案,OP仍然得到相同的例外情况就证明了这一点。是否添加了许可?
public class WebsiteDataWorker extends AsyncTask<String, Void, Void> {
public String html;
@Override
private void doInBackground(String... params) {
URL url = params[0];
HttpURLConnection response = (HttpURLConnection) url.openConnection();
String html = "";
InputStream in = response.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
StringBuilder str = new StringBuilder();
String line = null;
while((line = reader.readLine()) != null){
str.append(line);
}
in.close();
html = str.toString();
}
}
WebsiteDataWorker worker = new WebsiteDataWorker();
worker.execute("http://google.com");
String html = worker.html;
//do whatever stuff you want with the html variable
private class RegistrationAsyncTask extends AsyncTask<Void, Void, String> {
ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(MainActivity.this);
dialog.setTitle("Registration");
dialog.setMessage("Registration in process...");
dialog.setCancelable(false);
dialog.show();
}
@Override
protected String doInBackground(Void... params) {
try {
response = HttpClientWrapper.getResponseGET("Your url put here");
Log.e(TAG, "Response: " + response);
} catch (Exception e) {
e.printStackTrace();
this.error = e.getMessage();
}
return response;
}
@Override
protected void onPostExecute(String result) {
Log.e(TAG, "result: " + response);
if (dialog.isShowing()) {
dialog.dismiss();
}
}}
public static String getResponseGET(String url) {
String response = "";
HttpURLConnection c = null;
try {
URL u = new URL(url);
c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.setConnectTimeout(15000);
c.setReadTimeout(15000);
c.connect();
int status = c.getResponseCode();
switch (status) {
case 200:
case 201:
BufferedReader br = new BufferedReader(new InputStreamReader(c.getInputStream()));
StringBuilder sb = new StringBuilder();
String line;
while ((line = br.readLine()) != null) {
sb.append(line+"\n");
response = sb.toString().substring(0, sb.toString().length() - 1);
}
br.close();
return response;
}
} catch (IOException ex) {
if (c != null) {
c.disconnect();
}
} finally {
if (c != null) {
try {
c.disconnect();
} catch (Exception ex) {
}
}
}
return null;}