Пытаюсь создать тренировочный код, позволяющий выгружать с сайта www.flickr.com данные в фоновый поток и преобразовать в объекты JSONObject
public class BaseFromAPI {
private static final String TAG = "FlickrFetch";
private static final String API_KEY = "7997d726ccce33dbd0004e5b2bef67d1";
public SQLiteDatabase mSQLiteDatabase;
JSONObject jsonObject;
public BaseFromAPI() {
}
public byte[] getUrlBytes(String urlBase) throws IOException {
URL url = new URL(urlBase);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
try {
ByteArrayOutputStream out = new ByteArrayOutputStream();
InputStream in = connection.getInputStream();
if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
throw new IOException(connection.getResponseMessage() +
": with " +
urlBase);
}
int byteRead = 0;
byte[] buffer = new byte[1024];
while ((byteRead = in .read(buffer)) > 0) {
out.write(buffer, 0, byteRead);
}
out.close();
return out.toByteArray();
} finally {
connection.disconnect();
}
}
public String getUrlString(String urlBase) throws IOException, JSONException {
return new String(getUrlBytes(urlBase));
}
public void ShopItems() {
String jsonString;
try {
String url = Uri.parse("https://api.flickr.com/services/rest/")
.buildUpon()
.appendQueryParameter("method", "flickr.photos.getRecent")
.appendQueryParameter("api_key", API_KEY)
.appendQueryParameter("format", "json")
.appendQueryParameter("nojsoncallback", "1")
.appendQueryParameter("extras", "url_s")
.build().toString();
jsonString = getUrlString(url);
Log.i(TAG, "Received JSON: " + jsonString);
jsonObject = new JSONObject(jsonString);
} catch (JSONException e) {
e.printStackTrace();
} catch (IOException io) {
Log.e(TAG, "Failed to get items", io);
}
}
JSONObject goodsJSONObject;
public void parseItems(List<Goods> items, JSONObject j) throws IOException, JSONException {
JSONObject goodsJSONOject = jsonObject.getJSONObject("photos");
JSONArray goodsJSONArray = goodsJSONOject.getJSONArray("photo");
for (int i = 0; i < goodsJSONArray.length(); i++) {
goodsJSONObject = goodsJSONArray.getJSONObject(i);
}
}
public ContentValues addGood(Goods g) throws IOException, JSONException {
ContentValues values = new ContentValues();
List<Goods> items = new ArrayList<>();
parseItems(items, jsonObject);
values.put(ShopDbSchema.ShopTable.columnShop.TITLEOFGOODS, goodsJSONObject.getString("title"));
mSQLiteDatabase.insert(ShopDbSchema.ShopTable.NAME, null, values);
return values;
}
}
Но на
JSONObject goodsJSONOject = jsonObject.getJSONObject("photos");
выдает
java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONObject org.json.JSONObject.getJSONObject(java.lang.String)' on a null object reference
Сами данные с сайта приложение получает - в логе видно.
Полный текст ошибки в логе
E/AndroidRuntime: FATAL EXCEPTION: main Process: com.bignerdranch.android.shopbaseapi, PID: 17664 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.bignerdranch.android.shopbaseapi/com.bignerdranch.android.shopbaseapi.MainActivity2}: java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONObject org.json.JSONObject.getJSONObject(java.lang.String)' on a null object reference at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'org.json.JSONObject org.json.JSONObject.getJSONObject(java.lang.String)' on a null object reference at com.bignerdranch.android.shopbaseapi.BaseFromAPI.parseItems(BaseFromAPI.java:101) at com.bignerdranch.android.shopbaseapi.BaseFromAPI.addGood(BaseFromAPI.java:114) at com.bignerdranch.android.shopbaseapi.ArrayOfGoods.(ArrayOfGoods.java:66) at com.bignerdranch.android.shopbaseapi.MainActivity2.onCreate(MainActivity2.java:35) at android.app.Activity.performCreate(Activity.java:6662) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)
Наверно надо как-то вызвать ShopItems()
предварительно. Потому, что jsonObject
не инициализирован при вызове parseItems()
и это вызывает java.lang.NullPointerException
.
ShopItems();
parseItems(items, jsonObject);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Всем приветДопустим создаю уведомление обычное в сервисе с помощью NotificationCompat
Проблема заключается в том, что я не могу подключиться к серверному сокету на хероку
Я искал решение квадратного корня для BigDecimal и нашел 2 вариантаВыполнил несколько тестов для обоих, они работают с 10 000 точностью
Подскажите пожалуйста, как в java перевести строку 63672393600 в дату, чтобы не придумывать велосипед?