Android 从RSS提要读取数据-getInputStream();崩溃
对不起,我对安卓系统真的是个新手。我正在学习一个关于傻瓜的在线教程,并按照教程的说明编写了一个简单的应用程序,它可以读取RSS提要并将所有项目(标题+链接)放在列表视图中 在调试模式下,我发现崩溃发生在第73行Android 从RSS提要读取数据-getInputStream();崩溃,android,rss,feed,Android,Rss,Feed,对不起,我对安卓系统真的是个新手。我正在学习一个关于傻瓜的在线教程,并按照教程的说明编写了一个简单的应用程序,它可以读取RSS提要并将所有项目(标题+链接)放在列表视图中 在调试模式下,我发现崩溃发生在第73行 return url.openConnection().getInputStream(); 这是我的主要活动(很抱歉意大利评论和多个日志,我使用它进行调试) package com.example.readfrominternet; 导入androidx.appcompat.app.a
return url.openConnection().getInputStream();
这是我的主要活动(很抱歉意大利评论和多个日志,我使用它进行调试)
package com.example.readfrominternet;
导入androidx.appcompat.app.appcompat活动;
导入android.app.ProgressDialog;
导入android.content.Intent;
导入android.net.Uri;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.util.Log;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.ArrayAdapter;
导入android.widget.ListView;
导入android.widget.Toast;
导入org.xmlpull.v1.XmlPullParser;
导入org.xmlpull.v1.XmlPullParserException;
导入org.xmlpull.v1.XmlPullParserFactory;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.util.ArrayList;
公共类MainActivity扩展了AppCompatActivity
{
//变量定义
列表视图lvRss;
ArrayList titoli;
ArrayList链接;
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//agli-Oggeti可变资产
lvRss=findviewbyd(R.id.lvRss);
titoli=新的ArrayList();
link=newarraylist();
//具体的cosa票价南新加坡全岛项目
lvRss.setOnItemClickListener(新的AdapterView.OnItemClickListener()
{
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id)
{
日志v(“主要”、“南辛洛阿巴亚莫·克里卡托项目,里加54”);
Uri=Uri.parse(link.get(position));
意图=新意图(Intent.ACTION\u视图,uri);
星触觉(意向);
Log.v(“主要”、“Abbiamo aperto il link sul浏览器,里加58”);
}
});
新建ProcessInBackground().execute();
Log.v(“主要”,“背景中的Abbiamo eseguito il processo,里加64”);
}
//确定每种票价的方法
公共输入流getInputStream(URL)
{
Log.v(“主要”、“Siamo all'interno del getInputStream,里加70”);
尝试
{
返回url.openConnection().getInputStream();
}
捕获(例外e)
{
返回null;
}
}
公共类ProcessInBackground扩展异步任务
{
ProgressDialog=新建ProgressDialog(MainActivity.this);
异常=空;
@凌驾
受保护的void onPreExecute()
{
super.onPreExecute();
setMessage(“正在加载RSS源,请稍候!”);
progressDialog.show();
}
@凌驾
受保护的异常doInBackground(整数…参数)
{
Log.v(“主要”、“Siamo nel doInBackground,里加99”);
尝试
{
//servono-per-il解析
URL=新URL(“http://feeds.news24.com/articles/fin24/tech/rss");
XmlPullParserFactory工厂=XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp=factory.newPullParser();
setInput(getInputStream(url),“UTF_8”);//UTF_8èil tipo di-encoding utilizato per-il-testo
Log.v(“主”、“Siamo nel设置dello流媒体,里加109”);
//供应卡皮雷quando sono所有“interno dell”项目che voglio leggere
布尔值insideItem=false;
//变化的事件类型包括一个在开封或开封等地方的标签。
int eventType=xpp.getEventType();
Log.v(“主要”、“里加第115区蒂波埃维托市的Recuperiamo il tipo dell'evento”);
while(eventType!=XmlPullParser.END_文档)
{
Log.v(“主要”、“Siamo dentro il while,里加119”);
if(eventType==XmlPullParser.START_标记)
{
if(xpp.getName().equalsIgnoreCase(“项”))
{
insideItem=真;
}
else if(xpp.getName().equalsIgnoreCase(“title”))
{
如果(内部项目)
{
add(xpp.nextText());
}
}
else if(xpp.getName().equalsIgnoreCase(“链接”))
{
如果(内部项目)
{
add(xpp.nextText());
}
}
}
else if(eventType==XmlPullParser.END_标记&&xpp.getName().equalsIgnoreCase(“项”))
{
insideItem=假;
}
eventType=xpp.next();
}
}
catch(XMLPullParseRexE)
{
例外=e;
Toast.makeText(MainActivity.this,e.getMessage(),Toast.LENGTH\u SHORT);
}
捕获(格式错误)
{
例外=e;
Toast.makeText(MainActivity.this,e.getMessage(),Toast.LENGTH\u SHORT);
}捕获(IOE异常)
{
例外=e;
Toast.makeText(MainActivity.this,e.getMessage(),Toast.LENGT
package com.example.readfrominternet;
import androidx.appcompat.app.AppCompatActivity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity
{
//definiamo le variabili
ListView lvRss;
ArrayList<String> titoli;
ArrayList<String> link;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//assegniamo le variabili agli oggetti
lvRss = findViewById(R.id.lvRss);
titoli = new ArrayList<String>();
link = new ArrayList<String>();
//specifichiamo cosa fare quando clicchiamo sul singolo item
lvRss.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Log.v("MAIN", "Abbiamo cliccato sul singlo item, riga 54");
Uri uri = Uri.parse(link.get(position));
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
Log.v("MAIN", "Abbiamo aperto il link sul browser, riga 58");
}
});
new ProcessInBackground().execute();
Log.v("MAIN", "Abbiamo eseguito il processo in background, riga 64");
}
//definiamo il metodo per fare lo streaming del file
public InputStream getInputStream(URL url)
{
Log.v("MAIN", "Siamo all'interno del getInputStream, riga 70");
try
{
return url.openConnection().getInputStream();
}
catch(Exception e)
{
return null;
}
}
public class ProcessInBackground extends AsyncTask<Integer, Void, Exception>
{
ProgressDialog progressDialog = new ProgressDialog(MainActivity.this);
Exception exception = null;
@Override
protected void onPreExecute()
{
super.onPreExecute();
progressDialog.setMessage("Busy loading RSS feed, please wait!");
progressDialog.show();
}
@Override
protected Exception doInBackground(Integer... params )
{
Log.v("MAIN", "Siamo nel doInBackground, riga 99");
try
{
//servono per il parsing
URL url = new URL("http://feeds.news24.com/articles/fin24/tech/rss");
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(getInputStream(url), "UTF_8"); //UTF_8 è il tipo di encoding utilizzato per il testo
Log.v("MAIN", "Siamo nel setting dello streaming, riga 109");
//serve a capire quando sono all'interno dell'item che voglio leggere
boolean insideItem = false;
// la variabile eventType ci aiuta a capire se il tag che stiamo leggendo è un tag di apertura o di chiusura, etc.
int eventType = xpp.getEventType();
Log.v("MAIN", "Recuperiamo il tipo dell'evento, riga 115");
while(eventType != XmlPullParser.END_DOCUMENT)
{
Log.v("MAIN", "Siamo dentro il while, riga 119");
if(eventType == XmlPullParser.START_TAG)
{
if(xpp.getName().equalsIgnoreCase("item"))
{
insideItem = true;
}
else if (xpp.getName().equalsIgnoreCase("title"))
{
if(insideItem)
{
titoli.add(xpp.nextText());
}
}
else if (xpp.getName().equalsIgnoreCase("link"))
{
if(insideItem)
{
link.add(xpp.nextText());
}
}
}
else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item"))
{
insideItem = false;
}
eventType = xpp.next();
}
}
catch(XmlPullParserException e)
{
exception = e;
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT);
}
catch(MalformedURLException e)
{
exception = e;
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT);
}catch(IOException e)
{
exception = e;
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT);
}
return exception;
}
@Override
protected void onPostExecute(Exception s)
{
super.onPostExecute(s);
Log.v("MAIN", "Siamo nell'onPostExecute, riga 171");
//settiamo la lista con gli articoli letti
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, titoli);
lvRss.setAdapter(adapter);
Log.v("MAIN", "Settimao l'adapter della lista, riga 175");
progressDialog.dismiss();
Log.v("MAIN", "Dismettiamo il progress dialog, riga 178");
}
}
}
2019-10-21 18:08:42.873 14570-14570/com.example.readfrominternet E/WindowManager: android.view.WindowLeaked: Activity com.example.readfrominternet.MainActivity has leaked window DecorView@5ba2a72[MainActivity] that was originally added here
at android.view.ViewRootImpl.<init>(ViewRootImpl.java:511)
at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346)
at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
at android.app.Dialog.show(Dialog.java:329)
at com.example.readfrominternet.MainActivity$ProcessInBackground.onPreExecute(MainActivity.java:92)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:648)
at android.os.AsyncTask.execute(AsyncTask.java:595)
at com.example.readfrominternet.MainActivity.onCreate(MainActivity.java:63)
at android.app.Activity.performCreate(Activity.java:7136)
at android.app.Activity.performCreate(Activity.java:7127)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1271)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2893)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3048)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:78)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:108)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:68)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1808)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6669)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
public class MainActivity extends AppCompatActivity implements IRssCallback
{
ListView lvRss;
private ProgressDialog progressDialog;
private ArrayList<String> link;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lvRss = findViewById(R.id.lvRss);
progressDialog = new ProgressDialog(MainActivity.this);
lvRss.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Log.v("MAIN", "Abbiamo cliccato sul singlo item, riga 54");
Uri uri = Uri.parse(link.get(position));
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
Log.v("MAIN", "Abbiamo aperto il link sul browser, riga 58");
}
});
new ProcessInBackground(this).execute();
}
@Override
public void onProgress(boolean loading) {
if(loading) {
progressDialog.setMessage("Busy loading RSS feed, please wait!");
progressDialog.show();
}else{
progressDialog.dismiss();
}
}
@Override
public void onSuccess(ArrayList<String> list,ArrayList<String> link) {
this.link = link;
progressDialog.dismiss();
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, list);
lvRss.setAdapter(adapter);
}
@Override
public void onError(Exception e) {
Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();
}
}
public class ProcessInBackground extends AsyncTask<Integer, Void, ArrayList<String>>
{
private WeakReference<IRssCallback> listener;
public ProcessInBackground(IRssCallback listener){
this.listener = new WeakReference<IRssCallback>(listener);
}
private ArrayList<String> titoli = new ArrayList();
private ArrayList<String> link = new ArrayList();
@Override
protected void onPreExecute()
{
super.onPreExecute();
listener.get().onProgress(true);
}
@Override
protected ArrayList<String> doInBackground(Integer... params)
{
try
{
URL url = new URL("http://feeds.news24.com/articles/fin24/tech/rss");
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(false);
XmlPullParser xpp = factory.newPullParser();
InputStream inputStream = url.openConnection().getInputStream();
xpp.setInput(inputStream, "UTF_8");
boolean insideItem = false;
int eventType = xpp.getEventType();
while(eventType != XmlPullParser.END_DOCUMENT)
{
if(eventType == XmlPullParser.START_TAG)
{
if(xpp.getName().equalsIgnoreCase("item"))
{
insideItem = true;
}
else if (xpp.getName().equalsIgnoreCase("title"))
{
if(insideItem)
{
titoli.add(xpp.nextText());
}
}
else if (xpp.getName().equalsIgnoreCase("link"))
{
if(insideItem)
{
link.add(xpp.nextText());
}
}
}
else if (eventType == XmlPullParser.END_TAG && xpp.getName().equalsIgnoreCase("item"))
{
insideItem = false;
}
eventType = xpp.next();
}
}
catch(XmlPullParserException e) {
e.printStackTrace();
}
catch(MalformedURLException e) {
e.printStackTrace();
}catch(IOException e) {
e.printStackTrace();
}
return titoli;
}
@Override
protected void onPostExecute(ArrayList<String> list) {
super.onPostExecute(list);
listener.get().onSuccess(list, link);
}
}
public interface IRssCallback {
void onProgress(boolean loading);
void onSuccess(ArrayList<String> list,ArrayList<String> link);
void onError(Exception e);
}