Я сделал приложение для чтения новостей, где через его API выбираются 20 лучших новостных статей одного из ведущих новостных сайтов.
В одном действии содержится просмотр списка, в котором отображаются заголовки последних новостей, и при щелчке по ним открывается веб-просмотр в другом действии, соответствующем этой новостной статье.
Я загружаю контент через AsyncTask и onPostExecute. Я обновляю свой просмотр списка. Я хочу сделать то же самое в OnCreate, если база данных не пуста.
Я попытался проверить, если cursor.getstring (0) не ноль или! ArticleDB.equals (ноль), но не работает, и приложение вылетает при открытиив первый раз.
package com.example.freshnews;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteStatement;
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 org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
static ArrayList<String> titles=new ArrayList<>();
static ArrayList<String> articleHtml=new ArrayList<>();
static ArrayList<String> articleLinks=new ArrayList<>();
ArrayAdapter<String> arrayAdapter;
ListView newsListView;
String articleTitle,articleUrl,result,articleId;
SQLiteDatabase articleDB;
Cursor c;
public void updateListView()
{
c=articleDB.rawQuery("SELECT * FROM articles",null);
int titleIndex=c.getColumnIndex("articleTitle");
int codeIndex=c.getColumnIndex("articleCode");
int linkIndex=c.getColumnIndex("articleLinks");
if(c.moveToFirst())
{
titles.clear();
articleHtml.clear();
articleLinks.clear();
}
do {
titles.add(c.getString(titleIndex));
articleHtml.add(c.getString(codeIndex));
articleLinks.add(c.getString(linkIndex));
}while(c.moveToNext());
c.close();
arrayAdapter.notifyDataSetChanged();
}
public class DownloadTask extends AsyncTask<String,Void,String>
{
@Override
protected String doInBackground(String... strings) {
URL url;
result="";
HttpURLConnection urlConnection=null;
try {
url = new URL(strings[0]);
urlConnection=(HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
InputStreamReader reader=new InputStreamReader(inputStream);
int data=reader.read();
while(data != -1)
{
char current=(char) data;
result += current;
data=reader.read();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//Received article IDs
int articleCounter;
String newsSourceURL;
articleDB.execSQL("DELETE FROM articles");
try {
JSONArray jsonArray = new JSONArray(result);
if(jsonArray.length()<20)
{
articleCounter=jsonArray.length();
}
else
{
articleCounter=20;
}
for(int i=0;i<articleCounter;i++)
{
// Log.i("JSON Items",jsonArray.getString(i));
articleId=jsonArray.getString(i);
newsSourceURL="https://hacker-news.firebaseio.com/v0/item/" + articleId + ".json?print=pretty";
// Log.i("URL",newsSourceURL);
url=new URL(newsSourceURL);
urlConnection=(HttpURLConnection) url.openConnection();
InputStream inputStream=urlConnection.getInputStream();
InputStreamReader reader=new InputStreamReader(inputStream);
int data=reader.read();
String articleInfo="";
while(data!=-1)
{
char current=(char) data;
articleInfo+=current;
data=reader.read();
}
JSONObject jsonObject=new JSONObject(articleInfo);
if(!jsonObject.isNull("title") && !jsonObject.isNull("url")) {
articleTitle = jsonObject.getString("title");
articleUrl = jsonObject.getString("url");
}
// Log.i("Article Information",articleId + " " + articleTitle + " " + articleUrl);
/* URL urlHtml=new URL(articleUrl);
HttpURLConnection urlConnectionHtml=(HttpURLConnection) urlHtml.openConnection();
InputStream inputStreamHtml=urlConnectionHtml.getInputStream();
InputStreamReader readerHtml=new InputStreamReader(inputStreamHtml);
int dataHtml=readerHtml.read();
while(dataHtml<50)
{
char current=(char) dataHtml;
articleCode+=current;
dataHtml=readerHtml.read();
}
Log.i("Article HTML",articleCode);*/
String articleCode="<html><body><h1>Hi There</h1><p>How did you find my webview?</p></body></html>";
String sql="INSERT INTO articles (articleId,articleTitle,articleCode,articleLinks) VALUES (?, ?, ?, ?)";
SQLiteStatement statement=articleDB.compileStatement(sql);
statement.bindString(1,articleId);
statement.bindString(2,articleTitle);
statement.bindString(3,articleCode);
statement.bindString(4,articleUrl);
statement.execute();
}
} catch (JSONException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
updateListView();
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
newsListView=(ListView) findViewById(R.id.newsListView);
arrayAdapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,titles);
newsListView.setAdapter(arrayAdapter);
newsListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(getApplicationContext(),NewsActivity.class);
intent.putExtra("news",articleLinks.get(position));
startActivity(intent);
}
});
articleDB=this.openOrCreateDatabase("Articles",MODE_PRIVATE,null);
articleDB.execSQL("CREATE TABLE IF NOT EXISTS articles (id INTEGER PRIMARY KEY, articleId INTEGER, articleTitle VARCHAR, articleCode VARCHAR, articleLinks VARCHAR) ");
/* if(!c.moveToFirst()) { Facing the problem here
updateListView();
}*/
DownloadTask task=new DownloadTask();
try {
task.execute("https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty");
}catch (Exception e)
{
e.printStackTrace();
}
}
}