Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.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
Java 异步任务中URL的InputStream_Java_Android_Android Asynctask - Fatal编程技术网

Java 异步任务中URL的InputStream

Java 异步任务中URL的InputStream,java,android,android-asynctask,Java,Android,Android Asynctask,尝试将文件从URL获取到InputStream元素(使用AsyncTask)中,然后使用它,但迄今为止未成功。参数是否适合异步任务?我可以像在代码中那样检查InputStream吗?或者它是错误的,并且总是返回null?我还应该做些什么改变吗 我的代码: String url = "https://www.example.com/file.txt"; InputStream stream = null; public void load() { DownloadTask downloa

尝试将文件从URL获取到InputStream元素(使用AsyncTask)中,然后使用它,但迄今为止未成功。参数是否适合异步任务?我可以像在代码中那样检查InputStream吗?或者它是错误的,并且总是返回null?我还应该做些什么改变吗

我的代码:

String url = "https://www.example.com/file.txt";
InputStream stream = null;

public void load() {
    DownloadTask downloadTask = new DownloadTask();
    downloadTask.execute(url);
    if (stream == null) {
        //fail, stream == null
    } else {
        //success
    }
}

class DownloadTask extends AsyncTask <String, Integer, InputStream> {

@Override
protected void onPreExecute() {

}

@Override
protected InputStream doInBackground(String... params){

    try {
        URL url = new URL(url);
        stream = url.openStream();

    } catch (MalformedURLException e) {
            e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return stream;
}

@Override
protected void onPostExecute(InputStream result) {
    super.onPostExecute(result);
}
}
stringurl=”https://www.example.com/file.txt";
InputStream=null;
公共空荷载(){
DownloadTask DownloadTask=新的DownloadTask();
downloadTask.execute(url);
if(流==null){
//失败,流==null
}否则{
//成功
}
}
类DownloadTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的InputStream doInBackground(字符串…参数){
试一试{
URL=新URL(URL);
stream=url.openStream();
}捕获(格式错误){
e、 printStackTrace();
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
回流;
}
@凌驾
受保护的void onPostExecute(InputStream结果){
super.onPostExecute(结果);
}
}
编辑2: 我修好了

public void load(){
    //some code
    DownloadTask dt=new DownloadTask();
    dt.execute("www.example.com");
}

private class DownloadTask extends AsyncTask<String,Integer,Void>{
    InputStream text;

    protected Void doInBackground(String...params){
        URL url;
        try {
            url = new URL(params[0]);
            HttpURLConnection con=(HttpURLConnection)url.openConnection();
            InputStream is=con.getInputStream();
            text = is;
        }catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    protected void onPostExecute(Void result){
        //use "text"
    }
}
public void load(){
//一些代码
DownloadTask dt=新的DownloadTask();
dt.execute(“www.example.com”);
}
私有类DownloadTask扩展了AsyncTask{
输入流文本;
受保护的Void doInBackground(字符串…参数){
网址;
试一试{
url=新url(参数[0]);
HttpURLConnection con=(HttpURLConnection)url.openConnection();
InputStream=con.getInputStream();
text=is;
}捕获(例外e){
e、 printStackTrace();
}
返回null;
}
受保护的void onPostExecute(void结果){
//使用“文本”
}
}

您以错误的方式使用了
AsyncTask
。在
doInBackground(String…params)
方法中执行所有操作,如下载或服务器请求

非常重要的是要知道,您应该在
onPostExecute(..)
方法中更新UI。从UI线程调用此方法

下面是一个示例(伪代码):

class DownloadTask扩展了AsyncTask{
私有MyDownloadedData getFromStream(InputStream){
//待办事项
返回null;
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的MyDownloadedData doInBackground(字符串…参数){
试一试{
URL=新URL(URL);
InputStream=url.openStream();
MyDownloadedData=getFromStream(流);
返回数据;
}捕获(例外e){
//做点什么
}
回流;
}
@凌驾
受保护的void onPostExecute(MyDownloadedData数据){
//
//使用此方法更新您的UI。示例:
//
someLabel.setText(data.getName());
}
受保护的void onProgressUpdate(整数…进度){
//...
}
}
我解决了我的问题(编辑了我的问题)。感谢您告诉我需要更新onPostExecute()方法内部的UI!伪代码对于像我这样的初学者来说有点让人困惑,因为对于我的任务(在asynctask中获取inputstream),我不需要预执行、progressUpdate、getFromStream()-所有这些东西都与任务无关。
class DownloadTask extends AsyncTask <String, Integer, MyDownloadedData> {

    private MyDownloadedData getFromStream(InputStream stream){
        // TODO
        return null;
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected MyDownloadedData doInBackground(String... params){

        try {
            URL url = new URL(url);
            InputStream stream = url.openStream();

            MyDownloadedData data = getFromStream(stream);
            return data;
        } catch (Exception e) {
            // do something
        }
        return stream;
    }

    @Override
    protected void onPostExecute(MyDownloadedData data) {
        //
        // update your UI in this method. example:
        //
        someLabel.setText(data.getName());
    }

    protected void onProgressUpdate(Integer... progress) {
        //...
    }


}