Android Ленивая загрузка изображений из JSON в gridview
Поэтому я пытаюсь загрузить изображения из моего возвращенного массива json в шахматном порядке. Я уже тестировал размещение ссылок непосредственно в массив, как в примере, и он отлично работает, но как только я пытаюсь использовать данные json, я получаю ошибки (как сетевые, так и ошибки хранения). У меня есть все необходимые разрешения в моем манифесте (т.е., интернет, внутреннее и внешнее хранилище)
Вот мой код, может кто-нибудь, пожалуйста, дайте мне знать, что не так? Спасибо!!
package com.example.staggeredgridviewdemo;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import com.origamilabs.library.views.StaggeredGridView;
/**
*
* This will not work so great since the heights of the imageViews are
* calculated on the iamgeLoader callback ruining the offsets. To fix this try
* to get the (intrinsic) image width and height and set the views height
* manually. I will look into a fix once I find extra time.
*
* @author Maurycy Wojtowicz
*
*/
public class MainActivity extends Activity {
/*
* Images are taken by Romain Guy ! He's a great photographer as well as a
* great programmer. http://www.flickr.com/photos/romainguy
*/
private String urls[];
String location = "http://snapoodle.com/APIS/android/feed.php";
static final String TAG_ITEMS = "print";
/*
* private String urls[] = {
* "http://farm7.staticflickr.com/6101/6853156632_6374976d38_c.jpg",
* "http://farm8.staticflickr.com/7084/6885444694_6272874cfc.jpg" };
*/
/**
* This will not work so great since the heights of the imageViews are
* calculated on the iamgeLoader callback ruining the offsets. To fix this
* try to get the (intrinsic) image width and height and set the views
* height manually. I will look into a fix once I find extra time.
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StaggeredGridView gridView = (StaggeredGridView) this
.findViewById(R.id.staggeredGridView1);
getImages get= (getImages) new getImages();
get.execute(location);
//int margin = getResources().getDimensionPixelSize(R.dimen.margin);
//gridView.setItemMargin(margin); // set the GridView margin
//gridView.setPadding(margin, 0, margin, 0); // have the margin on the
// sides as well
StaggeredAdapter adapter = new StaggeredAdapter(MainActivity.this,
R.id.imageView1, urls);
gridView.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
class getImages extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
// TODO Auto-generated method stub
JSONObject json = JSONfunctions
.getJSONfromURL(location);
try {
JSONArray jarray;
jarray = json.getJSONArray(TAG_ITEMS);
urls = new String[jarray.length()];
for (int i = 0; i < jarray.length(); i++) {
JSONObject gridImages = jarray.getJSONObject(i);
urls[i] = gridImages.getString("saved_location");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
}
LogCat
03-22 14:57:59.276: D/AndroidRuntime(1183): Shutting down VM
03-22 14:57:59.276: W/dalvikvm(1183): threadid=1: thread exiting with uncaught exception (group=0x4111f930)
03-22 14:57:59.286: E/AndroidRuntime(1183): FATAL EXCEPTION: main
03-22 14:57:59.286: E/AndroidRuntime(1183): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.staggeredgridviewdemo/com.example.staggeredgridviewdemo.MainActivity}: java.lang.NullPointerException: storage == null
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.app.ActivityThread.access$600(ActivityThread.java:141)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.os.Handler.dispatchMessage(Handler.java:99)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.os.Looper.loop(Looper.java:137)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.app.ActivityThread.main(ActivityThread.java:5041)
03-22 14:57:59.286: E/AndroidRuntime(1183): at java.lang.reflect.Method.invokeNative(Native Method)
03-22 14:57:59.286: E/AndroidRuntime(1183): at java.lang.reflect.Method.invoke(Method.java:511)
03-22 14:57:59.286: E/AndroidRuntime(1183): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
03-22 14:57:59.286: E/AndroidRuntime(1183): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
03-22 14:57:59.286: E/AndroidRuntime(1183): at dalvik.system.NativeStart.main(Native Method)
03-22 14:57:59.286: E/AndroidRuntime(1183): Caused by: java.lang.NullPointerException: storage == null
03-22 14:57:59.286: E/AndroidRuntime(1183): at java.util.Arrays$ArrayList.<init>(Arrays.java:38)
03-22 14:57:59.286: E/AndroidRuntime(1183): at java.util.Arrays.asList(Arrays.java:154)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.widget.ArrayAdapter.<init>(ArrayAdapter.java:128)
03-22 14:57:59.286: E/AndroidRuntime(1183): at com.example.staggeredgridviewdemo.StaggeredAdapter.<init>(StaggeredAdapter.java:20)
03-22 14:57:59.286: E/AndroidRuntime(1183): at com.example.staggeredgridviewdemo.MainActivity.onCreate(MainActivity.java:89)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.app.Activity.performCreate(Activity.java:5104)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
03-22 14:57:59.286: E/AndroidRuntime(1183): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
03-22 14:57:59.286: E/AndroidRuntime(1183): ... 11 more
03-22 14:57:59.316: D/dalvikvm(1183): GC_CONCURRENT freed 176K, 3% free 8878K/9084K, paused 3ms+1ms, total 19ms
4 ответа
Я был немного глуп, но я решил эту проблему, переместив мое разнесенное представление сетки в onPostExecute и вернув URL из do в фоновом режиме.
StaggeredAdapter adapter = new StaggeredAdapter(MainActivity.this,
R.id.imageView1, urls);
gridView.setAdapter(adapter);
adapter.notifyDataSetChanged();
добавить этот код выше в onPostExecute
в AsyncTask
Надеюсь, что это поможет вам.
Эта линия 03-22 14:57:59.286: E/AndroidRuntime(1183): at com.example.staggeredgridviewdemo.MainActivity.onCreate(MainActivity.java:89)
говорит, что есть какая-то проблема в строке 89 вашего MainActivity
, Здесь вы создаете адаптер. Если вы посмотрите внимательно, вы увидите, что вы пытаетесь создать адаптер с null
список предметов - urls
еще не инициализирован.
AsyncTask
вы используете выполняется в другом потоке, так что все, что происходит в doInBackground
(лайк urls = new String[jarray.length()];
) есть в другой ветке. Что в данном случае означает, что urls
массив инициализируется после того, как он используется для создания адаптера.
Чтобы избежать этого, вы можете инициализировать массив перед началом действия. Если вы не знаете его размер в данный момент, вы можете использовать другой адаптер, например ListAdapter
инициализировать его ненулевым списком, а затем заполнить этот список из действия и вызвать notifyDataSetChanged
после того, как задача выполнена
Проверьте канал данных, http://snapoodle.com/APIS/android/feed.php, я не вижу никаких данных, возвращаемых из запроса.
{"Распечатать":[]}