Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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 通过环路的数据泄漏_Android_Android Asynctask_Android Studio 2.0 - Fatal编程技术网

Android 通过环路的数据泄漏

Android 通过环路的数据泄漏,android,android-asynctask,android-studio-2.0,Android,Android Asynctask,Android Studio 2.0,我试图通过AsyncTask下载网页的html,然后在日志中显示该html 这是我的密码。然而,当我运行代码时,循环从未停止过 public class MainActivity extends AppCompatActivity { public class DownloadTask extends AsyncTask<String,Void,String>{ @Override protected String doInBackgroun

我试图通过
AsyncTask
下载网页的html,然后在日志中显示该html

这是我的密码。然而,当我运行代码时,循环从未停止过

public class MainActivity extends AppCompatActivity {

    public class DownloadTask extends AsyncTask<String,Void,String>{
        @Override
        protected String doInBackground(String... urls) {

            String result = "";
            HttpURLConnection connection = null;
            URL myUrl;

            try{
                myUrl = new URL(urls[0]);
                connection = (HttpURLConnection) myUrl.openConnection();
                InputStream in = connection.getInputStream();
                InputStreamReader reader = new InputStreamReader(in);

                int data  = reader.read();
                while(data != -1){
                    char current = (char) data;
                    result += current;
                    data = reader.read();
                }
                return result;
            }
            catch(Exception e){
                e.printStackTrace();
                return "Failed";
            }
        }
    }


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

        DownloadTask task = new DownloadTask();
        try {
            String result = task.execute("http://www.posh24.com/celebrities").get();
            Log.i("asd",String.valueOf(result));
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

知道代码有什么问题吗?

可能是因为在收到的每个字符上都创建了一个新字符串。不要这样做:

result += current;
相反,创建一个
StringBuilder
并附加到它


或者,最好不要一次读取一个字符,而是创建一个
BufferedReader
并读入一个相当大的缓冲区,例如1024字节。

代码的问题是
数据在您使用一个
read()
调用初始化后不会更改,因此它永远不会是
-1
(因此是无限循环)

您需要在循环内调用
read()

替换以下内容:

int data  = reader.read();
while(data != -1){
    // ...
比如说:

int data;
while ((data = reader.read()) != -1) {
    // ...
为了加快速度,您可以使用
BufferedReader

BufferedReader reader = new BufferedReader(new InputStreamReader(in));

String line = null;
StringBuilder builder = new StringBuilder();

while((line = reader.readLine()) != null) {
    builder.append(line);
}

String data = builder.toString();

我可以通过您的代码获取数据。我相信您在测试时已经添加了internet权限

但是由于task.execute().get(),您的代码阻塞了UI线程。我对其进行了一些更改:

public class DownloadTask extends AsyncTask<String, Void, String> {

private Listener mListener;

DownloadTask(Listener listener) {
    mListener = listener;
}

@Override
protected String doInBackground(String... urls) {

    String result = "";
    HttpURLConnection connection = null;
    URL myUrl;

    try {
        myUrl = new URL(urls[0]);
        connection = (HttpURLConnection) myUrl.openConnection();
        InputStream in = connection.getInputStream();
        InputStreamReader reader = new InputStreamReader(in);

        int data = reader.read();

        while (data != -1) {
            char current = (char) data;
            result += current;
            data = reader.read();
        }

        return result;
    } catch (Exception e) {
        e.printStackTrace();
        return "Failed";
    }
}

@Override
protected void onPostExecute(String s) {
    mListener.deliverResult(s);
}

public interface Listener {
    void deliverResult(String result);
}

@Junaid,这不是一个编码服务。你有你自己需要的一切。现在下载的数据丢失了。是的,很好。非常感谢:)
public class DownloadTask extends AsyncTask<String, Void, String> {

private Listener mListener;

DownloadTask(Listener listener) {
    mListener = listener;
}

@Override
protected String doInBackground(String... urls) {

    String result = "";
    HttpURLConnection connection = null;
    URL myUrl;

    try {
        myUrl = new URL(urls[0]);
        connection = (HttpURLConnection) myUrl.openConnection();
        InputStream in = connection.getInputStream();
        InputStreamReader reader = new InputStreamReader(in);

        int data = reader.read();

        while (data != -1) {
            char current = (char) data;
            result += current;
            data = reader.read();
        }

        return result;
    } catch (Exception e) {
        e.printStackTrace();
        return "Failed";
    }
}

@Override
protected void onPostExecute(String s) {
    mListener.deliverResult(s);
}

public interface Listener {
    void deliverResult(String result);
}
        DownloadTask task = new DownloadTask(new DownloadTask.Listener() {
        @Override
        public void deliverResult(String result) {
            Log.i("asd",String.valueOf(result));
        }
    });
    task.execute("http://www.posh24.com/celebrities");