I'm working on parsing json from graph.facebook.com. I managed to get the json from graph.facebook.com. But the problem, that I'm getting now is that I can retrieve the value inside "id" from this graph. But while trying to retrieve value from album I'm gettin error like this.
07-04 16:40:46.939: E/AndroidRuntime(13450): FATAL EXCEPTION: AsyncTask #1
07-04 16:40:46.939: E/AndroidRuntime(13450): java.lang.RuntimeException: An error occured while executing doInBackground()
07-04 16:40:46.939: E/AndroidRuntime(13450): at android.os.AsyncTask$3.done(AsyncTask.java:200)
07-04 16:40:46.939: E/AndroidRuntime(13450): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
07-04 16:40:46.939: E/AndroidRuntime(13450): at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
07-04 16:40:46.939: E/AndroidRuntime(13450): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
07-04 16:40:46.939: E/AndroidRuntime(13450): at java.util.concurrent.FutureTask.run(FutureTask.java:138)
07-04 16:40:46.939: E/AndroidRuntime(13450): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
07-04 16:40:46.939: E/AndroidRuntime(13450): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
07-04 16:40:46.939: E/AndroidRuntime(13450): at java.lang.Thread.run(Thread.java:1019)
07-04 16:40:46.939: E/AndroidRuntime(13450): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
07-04 16:40:46.939: E/AndroidRuntime(13450): at android.os.Handler.<init>(Handler.java:121)
07-04 16:40:46.939: E/AndroidRuntime(13450): at android.widget.Toast.<init>(Toast.java:68)
07-04 16:40:46.939: E/AndroidRuntime(13450): at android.widget.Toast.makeText(Toast.java:231)
07-04 16:40:46.939: E/AndroidRuntime(13450): at com.ministry.ensing119app.photos.GetPath$Message.doInBackground(GetPath.java:114)
07-04 16:40:46.939: E/AndroidRuntime(13450): at com.ministry.ensing119app.photos.GetPath$Message.doInBackground(GetPath.java:1)
07-04 16:40:46.939: E/AndroidRuntime(13450): at android.os.AsyncTask$2.call(AsyncTask.java:185)
07-04 16:40:46.939: E/AndroidRuntime(13450): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
07-04 16:40:46.939: E/AndroidRuntime(13450): ... 4 more
07-04 16:40:47.149: E/WindowManager(13450): Activity com.ministry.ensing119app.photos.GetPath has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40591a50 that was originally added here
07-04 16:40:47.149: E/WindowManager(13450): android.view.WindowLeaked: Activity com.ministry.ensing119app.photos.GetPath has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@40591a50 that was originally added here
07-04 16:40:47.149: E/WindowManager(13450): at android.view.ViewRoot.<init>(ViewRoot.java:265)
07-04 16:40:47.149: E/WindowManager(13450): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
07-04 16:40:47.149: E/WindowManager(13450): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
07-04 16:40:47.149: E/WindowManager(13450): at android.view.Window$LocalWindowManager.addView(Window.java:424)
07-04 16:40:47.149: E/WindowManager(13450): at android.app.Dialog.show(Dialog.java:241)
07-04 16:40:47.149: E/WindowManager(13450): at com.ministry.ensing119app.photos.GetPath$Message.onPreExecute(GetPath.java:159)
07-04 16:40:47.149: E/WindowManager(13450): at android.os.AsyncTask.execute(AsyncTask.java:391)
07-04 16:40:47.149: E/WindowManager(13450): at com.ministry.ensing119app.photos.GetPath.onCreate(GetPath.java:49)
07-04 16:40:47.149: E/WindowManager(13450): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
07-04 16:40:47.149: E/WindowManager(13450): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)
07-04 16:40:47.149: E/WindowManager(13450): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
07-04 16:40:47.149: E/WindowManager(13450): at android.app.ActivityThread.access$1500(ActivityThread.java:121)
07-04 16:40:47.149: E/WindowManager(13450): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
07-04 16:40:47.149: E/WindowManager(13450): at android.os.Handler.dispatchMessage(Handler.java:99)
07-04 16:40:47.149: E/WindowManager(13450): at android.os.Looper.loop(Looper.java:123)
07-04 16:40:47.149: E/WindowManager(13450): at android.app.ActivityThread.main(ActivityThread.java:3701)
07-04 16:40:47.149: E/WindowManager(13450): at java.lang.reflect.Method.invokeNative(Native Method)
07-04 16:40:47.149: E/WindowManager(13450): at java.lang.reflect.Method.invoke(Method.java:507)
07-04 16:40:47.149: E/WindowManager(13450): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:862)
07-04 16:40:47.149: E/WindowManager(13450): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:620)
07-04 16:40:47.149: E/WindowManager(13450): at dalvik.system.NativeStart.main(Native Method)
My code to parse json goes like this.
getSource.java
import com.ministry.ensing119app.HomeScreen;
import com.ministry.ensing119app.R;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import java.util.ArrayList;
import java.util.HashMap;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import android.os.AsyncTask;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.Toast;
public class GetPath extends Activity {
public static String url = "http://graph.facebook.com/fundamentalalvarado/?fields=albums.fields(photos.fields(source))";
public String[] IMAGES;
// JSON Node names
protected static final String TAG_PRODUCTS = "image_path";
protected static final String TAG_CID = "file_id";
public static final String TAG_NAME = "file_name";
// contacts JSONArray
JSONArray products = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ConnectivityManager connectivityManager
= (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if ((activeNetworkInfo != null && activeNetworkInfo.isConnected())) {
Log.d("if condition", "if condition is running");
new Message().execute(url);
} else {
Log.d("if condition", "else condition is running");
Toast.makeText(getApplicationContext(), "The internet is not present or low. Please check", Toast.LENGTH_LONG).show();
Intent returnIntent = new Intent(GetPath.this, HomeScreen.class);
startActivity(returnIntent);
}
}
class Message extends AsyncTask<String, Integer, ArrayList<HashMap<String, String>> > {
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
ProgressDialog progress = new ProgressDialog(GetPath.this);
JSONParser jParser = new JSONParser();
@Override
protected ArrayList<HashMap<String, String>> doInBackground(String... params) {
Log.d("doInBackgound","backgound is running");
// getting JSON string from URL
JSONObject json = jParser.getJSONFromUrl(url);
Log.d("Json", json.toString());
Log.d("path_parsing", "before parsing");
try {
Log.d("json id", json.getString("id"));
JSONArray albumArray = json.getJSONArray("albums");
for(int i=0; i<albumArray.length();i++){
JSONArray dataArray = albumArray.getJSONObject(i).getJSONArray("data");
Log.d("jsons", dataArray.toString());
for(int j=0;j<dataArray.length();j++){
JSONArray photoArray = dataArray.getJSONObject(j).getJSONArray("photos");
Log.d("jsons", photoArray.toString());
for(int k=0; k<photoArray.length();k++){
JSONArray dataArray1 = photoArray.getJSONObject(k).getJSONArray("data");
Log.d("jsons", dataArray1.toString());
for(int l=0;l<dataArray1.length();l++){
String source = dataArray1.getJSONObject(l).getString("source");
}
}
}
}
// Getting Array of Contacts
} catch (JSONException e) {
Toast.makeText(getApplicationContext(), "Cannot get the images", Toast.LENGTH_LONG).show();
Intent goBack = new Intent(GetPath.this,GridActivity.class);
startActivity(goBack);
e.printStackTrace();
}
Log.d("path_parsing", "after parsing");
return mylist;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
if(progress.isShowing()){
progress.cancel();
}
IMAGES = new String[result.size()];
for(int i=0; i<result.size(); i++){
IMAGES[i] = result.get(i).get("file_name");
}
for(String path: IMAGES){
Log.d("path", path.toString());
}
Log.d("postExecute","Postexecute is running");
Bundle b=new Bundle();
b.putStringArray("IMAGES", IMAGES);
Intent i=new Intent(GetPath.this, GridActivity.class);
i.putExtras(b);
startActivity(i);
GetPath.this.finish();
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
super.onPreExecute();
progress.setTitle("Loading");
progress.setMessage("Retrieving Images");
progress.show();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.get_path, menu);
return true;
}
}
Can anyone please tell me where I'm going wrong. I'm newbie to android.
After many hours of scratching head, came to this solution. Not much efficient one, but it will do the things you need.
JSONObject albumObj = json.getJSONObject("albums");
// Log.d("Json values", albumObj.toString());
JSONArray dataArray1 = albumObj.getJSONArray("data");
for(int i=0; i<dataArray1.length(); i++){
// Log.d("data id", dataArray1.getJSONObject(i).getString("id"));
JSONObject photoObj= dataArray1.getJSONObject(i).getJSONObject("photos");
// Log.d("photo object", photoObj.toString());
JSONArray dataArray2 = photoObj.getJSONArray("data");
for(int j=0; j<dataArray2.length();j++){
Log.d("source", dataArray2.getJSONObject(j).getString("source"));
source = dataArray2.getJSONObject(j).getString("source");
}