문제

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");

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top