Android 从RSS提要读取数据-getInputStream();崩溃

Android 从RSS提要读取数据-getInputStream();崩溃,android,rss,feed,Android,Rss,Feed,对不起,我对安卓系统真的是个新手。我正在学习一个关于傻瓜的在线教程,并按照教程的说明编写了一个简单的应用程序,它可以读取RSS提要并将所有项目(标题+链接)放在列表视图中 在调试模式下,我发现崩溃发生在第73行 return url.openConnection().getInputStream(); 这是我的主要活动(很抱歉意大利评论和多个日志,我使用它进行调试) package com.example.readfrominternet; 导入androidx.appcompat.app.a

对不起,我对安卓系统真的是个新手。我正在学习一个关于傻瓜的在线教程,并按照教程的说明编写了一个简单的应用程序,它可以读取RSS提要并将所有项目(标题+链接)放在列表视图中

在调试模式下,我发现崩溃发生在第73行

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);
}