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