Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android java中从网页获取信息_Java_Android_Webpage_Bufferedreader - Fatal编程技术网

如何在android java中从网页获取信息

如何在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

我一直在尝试将网页上的信息转换成字符串,放到我的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.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()的代码放进去。这样您就可以确保异步任务已经完成。