如何在android java中从网页获取信息
我一直在尝试将网页上的信息转换成字符串,放到我的android应用程序上。我一直在用这种方法如何在android java中从网页获取信息,java,android,webpage,bufferedreader,Java,Android,Webpage,Bufferedreader,我一直在尝试将网页上的信息转换成字符串,放到我的android应用程序上。我一直在用这种方法 import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLConnection;
public class DownloadPage {
private static int arraySize;
public static int getArraySize() throws IOException {
URL url = new URL("http://woah.x10host.com/randomfact2.php");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String size = br.readLine();
arraySize = Integer.parseInt(size);
return arraySize;
}
}
我甚至在我的AndroidManifest.xml文件中包含了这个权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
但是,我不断收到错误,我的应用程序将无法启动。每次我调用该方法或类时,它都会崩溃。问题可能出现在以下代码中:
String size = br.readLine();
arraySize = Integer.parseInt(size);
您正在尝试将字符串解析为整数。检查br.readLine()是否只包含整数值。若字符串包含非数字字符,则会出现问题
如果知道行的哪一部分包含大小,可以获取子字符串,然后将其解析为int
请尝试以下内容:
String resposne = br.readLine();
// If you are sure that array length is only 2 digits.
String length = response.subString(0,2);
arraySize = Integer.parseInt(length);
您似乎得到了
android.os.NetworkOnMainThreadException
。
请使用AsyncTask尝试获取该整数
public class DownloadPage {
private static int arraySize;
public void getArraySize() throws IOException {
new RetrieveInt().execute();
}
private class RetrieveInt extends AsyncTask<String, Void, Integer> {
@Override
protected Integer doInBackground(String ... params) {
try {
URL url = new URL("http://woah.x10host.com/randomfact2.php");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF-8"));
String size = br.readLine();
arraySize = Integer.parseInt(size);
} catch (Exception e) {
//do something
}
return arraySize; // gets 18
}
protected void onPostExecute(Integer i) {
// TODO: do something with the number
// You would get value of i == 18 here. This methods gets called after your doInBackground() with output.
System.out.println(i);
}
}
}
公共类下载页面{
私有静态数组化;
public void getArraySize()引发IOException{
新建RetrieveInt().execute();
}
私有类检索扩展了异步任务{
@凌驾
受保护的整数doInBackground(字符串…参数){
试一试{
URL=新URL(“http://woah.x10host.com/randomfact2.php");
HttpURLConnection urlConnection=(HttpURLConnection)url.openConnection();
InputStream in=new BufferedInputStream(urlConnection.getInputStream());
BufferedReader br=新的BufferedReader(新的InputStreamReader(在“UTF-8”中));
字符串大小=br.readLine();
arraySize=Integer.parseInt(大小);
}捕获(例外e){
//做点什么
}
return arraySize;//获取18
}
受保护的void onPostExecute(整数i){
//托多:用这个号码做点什么
//这里的值为i==18。此方法在输出为doInBackground()之后调用。
系统输出打印LN(i);
}
}
}
您无法使用Handler或AynTask在主ui线程中连接android应用程序和web服务器。并使用logcat查看Web服务器数据,因为您的错误是在主线程中访问Web服务器,因此您必须使用AsynTask,正如Amey所回答的那样。如果不稍加更新,那么使用代码中的int就会有问题
你可以“pauze”你的应用程序来等待AsynTask完成,但这会破坏使用AsyncTask的目的。AsyncTasks可以让你的应用程序继续运行,而不必等待缓慢的功能完成
要使用数组大小,请在onPostExecute中添加一个函数DownloadPage。这是。使用ArrayLength(i)
并添加到DownloadPage
public void useArrayLength(int length){
//do something with length
}
在main中使用.wait(),这样它将在main之前首先处理asynctask
从这个答案中:
网页中的第一行始终是数字字符,因为我控制网页上的内容。我检查了您提到的网页的响应。它有以下单线:18 1;测试1-2;试验2-3;试验3-4;试验4-5;试验5-6;测试6-7;测试6-8;测试7-9;测试8-10;测试9-11;测试10-12;测试12 13;afdadsf 14;adfasdf15;hdgsf 16;adfasdf17;sfhfsd 18;是的。该字符串中的前18个是我试图从网页中获取到应用程序中的值,是因为我试图在与主线程相同的线程上访问internet吗?如果是的话。关于如何创建一个新线程来解决这个问题的想法没有。这是因为在打电话之后,你得到的是一条完整的线路,它的数据不是长度。请检查我的更新答案,如果响应中的前2个字符映射到数组长度,该答案将起作用。是的,您是正确的。你能帮我使用这个任务吗?我一直在尝试使用它,但我似乎无法理解它是如何工作的。是的,这种方法似乎很有效。但是,出现的唯一问题是,arraySize的收集速度不够快,无法使用。如何暂停主应用程序,直到我从网站收集信息?您可以在
onPostExecute()
中使用该数组执行任何操作(这是由doInBackground()
计算的操作结果)。只有在收到数组执行后,onPostExecute()
才会在UI线程上运行。如果任务被取消,将不会调用它。您能指定您将收到哪些错误吗?请检查您的日志并更新您的答案。两个明显的可能问题要么是在主线程上访问Web服务器,要么是对大小字符串的解析错误。第一次检查。如果解析时出错,请使用Santosh的答案,但我会在“”上拆分,并使用拆分[0],而不是假设它总是长度为2。我在尝试从主线程访问Web服务器时遇到错误。多亏了之前的评论,我才得以修复。然而,现在我遇到的问题是asyntask线程收集信息花费的时间太长,导致应用程序崩溃,因为空值是android java的新手。你能给我解释一下useArrayLength方法的作用吗?在这个函数中,你把以前使用getArraySize()的代码放进去。这样您就可以确保异步任务已经完成。