Попытка прочитать URL с использованием входного потока. Сам код предназначен для создания списка подкастов из RSS-канала. понятия не имею, почему ошибка продолжает появляться. Попытался напрямую вставить RSS, но это ничего не изменило.
Код:
class RevisedSermonFragment: Fragment(){
companion object {
fun newInstance(): RevisedSermonFragment {
return RevisedSermonFragment()
}
}
private lateinit var recyclerView: RecyclerView
private lateinit var titleText: TextView
private var sermonList: ArrayList<RevisedSermonModel> = ArrayList()
private lateinit var swipeRefreshLayout: SwipeRefreshLayout
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.sermon_detail, container, false)
recyclerView = view.findViewById(R.id.recycler_sermon_detail)
titleText = view.findViewById(R.id.sermon_title_d)
titleText.text = "Sermons"
val decoration = DividerItemDecoration(context, 1)
recyclerView.addItemDecoration(decoration)
swipeRefreshLayout = view.findViewById(R.id.sermon_swipe_d)
recyclerView.layoutManager = LinearLayoutManager(context)
swipeRefreshLayout.setOnRefreshListener {
FetchFeedTask().execute(null)
}
return view
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
FetchFeedTask().execute(null)
}
private fun parseXML(inputStream: InputStream): ArrayList<RevisedSermonModel>{
var parserFactory: XmlPullParserFactory
var sermons = ArrayList<RevisedSermonModel>()
try {
parserFactory = XmlPullParserFactory.newInstance()
var parser: XmlPullParser = parserFactory.newPullParser()
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false)
parser.setInput(inputStream, "UTF-8")
sermons = processParsing(parser)
} catch (ex: XmlPullParserException){
Log.e("XMLPullParser Exception", ex.printStackTrace().toString())
} catch (ex: IOException){
Log.e("IOException - RSF", ex.toString())
} catch (ex: NetworkOnMainThreadException){
Log.e("NOMTException - RSF", ex.toString())
}
return sermons
}
@SuppressLint("SimpleDateFormat")
private fun processParsing(parser: XmlPullParser): ArrayList<RevisedSermonModel>{
val sermons = ArrayList<RevisedSermonModel>()
var eventType = parser.eventType
var currentSermon = RevisedSermonModel()
loop@ while(eventType != XmlPullParser.END_DOCUMENT) {
var eltName: String
when(eventType){
XmlPullParser.START_TAG -> {
eltName = parser.name
if ("item" == eltName){
currentSermon = RevisedSermonModel()
sermons.add(currentSermon)
} else if (currentSermon != null){
when (eltName) {
"title" -> {
currentSermon.setTitle( parser.nextText())
}
"author" -> {
currentSermon.setPreacher(parser.nextText())
}
"link" -> {
currentSermon.setUri(parser.nextText())
}
"pubDate" -> {
val pattern = "yyyy-MM-dd"
val sdf = SimpleDateFormat(pattern)
val date = sdf.format(Date( parser.nextText()))
currentSermon.setDate(date)
}
}
}
}
}
eventType = parser.next()
}
return sermons
}
inner class FetchFeedTask: AsyncTask<Void, Void, Boolean>(){
private lateinit var urlLink: String
override fun onPreExecute() {
swipeRefreshLayout.isRefreshing = true
urlLink = "http://www.gracechurchmiltonkeynes.org/audio/podcast.xml"
}
override fun doInBackground(vararg params: Void?): Boolean {
if (TextUtils.isEmpty(urlLink)) return false
try {
var url = URL("http://www.gracechurchmiltonkeynes.org/audio/podcast.xml")
var inputStream = url.openConnection().getInputStream()
sermonList = parseXML(inputStream)
return true
} catch (ex: XmlPullParserException){
Log.e("XMLPullParser Exception", ex.printStackTrace().toString())
} catch (ex: IOException){
Log.e("IOException - RSF", ex.toString())
} catch (ex: NetworkOnMainThreadException){
Log.e("NOMTException - RSF", ex.toString())
}
return false
}
override fun onPostExecute(result: Boolean?) {
swipeRefreshLayout.isRefreshing = false
if (result!!){
val sortedList = sermonList.sortedByDescending { revisedSermonModel -> revisedSermonModel.getDate() }
val adapter = SermonDetailAdapter(context, sortedList)
recyclerView.adapter = adapter
}else{
Toast.makeText(context, "RSS pull failed", Toast.LENGTH_LONG).show();
}
}
}
}
Logcat:
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: org.xmlpull.v1.XmlPullParserException: Expected a quoted string (position:DOCDECL @1:50 in java.io.InputStreamReader@9e8482a)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.android.org.kxml2.io.KXmlParser.readQuotedId(KXmlParser.java:671)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.android.org.kxml2.io.KXmlParser.readExternalId(KXmlParser.java:650)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.android.org.kxml2.io.KXmlParser.readDoctype(KXmlParser.java:591)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.android.org.kxml2.io.KXmlParser.next(KXmlParser.java:421)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.android.org.kxml2.io.KXmlParser.next(KXmlParser.java:313)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.llamaless.gracechruchmk.RevisedSermonFragment.processParsing(RevisedSermonFragment.kt:127)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.llamaless.gracechruchmk.RevisedSermonFragment.parseXML(RevisedSermonFragment.kt:78)
2019-12-11 15:30:38.567 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.llamaless.gracechruchmk.RevisedSermonFragment.access$parseXML(RevisedSermonFragment.kt:32)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.llamaless.gracechruchmk.RevisedSermonFragment$FetchFeedTask.doInBackground(RevisedSermonFragment.kt:147)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err: at com.llamaless.gracechruchmk.RevisedSermonFragment$FetchFeedTask.doInBackground(RevisedSermonFragment.kt:132)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err: at android.os.AsyncTask$3.call(AsyncTask.java:378)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:266)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
2019-12-11 15:30:38.568 9081-9149/com.llamaless.gracechruchmk W/System.err: at java.lang.Thread.run(Thread.java:919)
Я перепробовал практически все, что мог придумать. В верхней части следующих нескольких уроков, чтобы сделать это. Если это поможет, перед добавлением метода Async я сделал то же самое, читая из папки ресурсов, и это работало отлично. Только когда я переключился на чтение xml динамически, я начал получать сообщения об ошибках.