Soru & Cevap

Uygulama Neden Çöküyor? ...

15.11.2014 - 03:05

Merhaba. Yabancı bir siteden JSON parsing örnekleri araştırırken örnek bir kod buldum. Kendime göre uyarladığımda çalışmadı. Nedeni ne olabilir. Ekte hata kayıtları var. Aşağıya da kodları döküyorum. 

MainActivity Kodlarım;

public class MainActivity extends Activity {
    
    //URL to get JSON Array
    private static String url = "https://www.kimonolabs.com/api/27ctyd80?apikey=v3sVcXRF5B64zg2uUuKRhI37T7ZJTZnJ";
    
    //JSON Node Names 
    private static final String TAG_BIRIM = "USDTRY";
    private static final String TAG_DEGER = "Deger";
    private static final String TAG_ACILIS = "Acilis";
    private static final String TAG_ARALIK = "Aralik";
    
    JSONArray USDTRY = null;

 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
      
        setContentView(R.layout.activity_main);
        
        // Creating new JSON Parser
        JSONParser jParser = new JSONParser();

        // Getting JSON from URL
        JSONObject json = jParser.getJSONFromUrl(url);
        
        try {
            // Getting JSON Array
            USDTRY = json.getJSONArray(TAG_BIRIM);
            JSONObject c = USDTRY.getJSONObject(0);
            
            // Storing  JSON item in a Variable
            String degerr = c.getString(TAG_DEGER);
            String aciliss = c.getString(TAG_ACILIS);
            String aralikk = c.getString(TAG_ARALIK);
            
            //Importing TextView
            final TextView degerT = (TextView)findViewById(R.id.uid);
            final TextView acilisT = (TextView)findViewById(R.id.name);
            final TextView aralikT = (TextView)findViewById(R.id.email);
            
          
            degerT.setText(degerr);
            acilisT.setText(aciliss);
            aralikT.setText(aralikk);

        
    } catch (JSONException e) {
        e.printStackTrace();
    }

    }
}

---

JSONParser.java Kodlarım;

public class JSONParser {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // constructor
    public JSONParser() {

    }

    public JSONObject getJSONFromUrl(String url) {

        // Making HTTP request
        try {
            // defaultHttpClient
            DefaultHttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();
            is = httpEntity.getContent();            

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting result " + e.toString());
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON String
        return jObj;

    }
}

22 Görüntülenme

4 Cevap

Sitedeki sorulara cevap verebilmek için giriş yapın ya da üye olun.

picture-7617-1421911538.jpg
sametgunduz
19.11.2014 - 04:48

Tüm satırları breakpoint koyarak adım adım test edermisin ? Hangi işlemde düşüyor hataya ? O şekilde bir çözüm bulalım.

Profile picture for user hulusi5506
hulusi5506
18.11.2014 - 04:33

Samet hocam verdiğiniz kodu tekrar denedim. Butona tıkladığımda uygulama çöküyor. Api de şurası. Çalışıyor yani.

Profile picture for user hulusi5506
hulusi5506
15.11.2014 - 01:56

Arkadaşlar şu adresteki AsyncTask JSONParse uygulamasını indirdim, kendime uyarlayıp çalıştırdım. Veriler yüklendi ama bu bekleme işi uzun sürüyor. Async task işime yaramayacak gibi.

Bir daha sormak istiyorum. Sorumda belirttiğim kodlar neden çalışmadı?

Samet
18.11.2014 - 10:03
AsyncTask'in işine yaramama gibi bir durum söz konusu değildir, http get post işlemlerini async olarak yapmalısın. İşlemin uzun sürmesinin nedeni işlediğin verinin büyüklüğü, örneğin bir listview'de gösteriyorsan verilerini ve 200 adette verin varsa bunu sayfalayarak bind ettirmelisin. Yukarıda paylaştığım kodların sonucunda dönen hatayı paylaşırmısın ?
Hulusi Dinç
18.11.2014 - 02:08
Hocam sorumun içeriğinde hata.png var oradan log kayıtlarını görebilirsiniz. Bu arada veri çekmek istediğim sayfada sadece birkaç tane veri var bu kadar uzun sürmesi çok da normal olmasa gerek.
Samet
18.11.2014 - 02:28
ilginç :) kullandığın api'da bir sıkıntı olabilir mi ?. gerekli permissionsların tam olduguna da dikkat et. Ayrıca yukarıdaki paylaştığın kodların dediğim gibi hata vermesi normal, UI Thread'te get post işlemi yapamazsın. Benim yukarıda paylaştığım kod yapısıyla yapmayı dene, ayrıca api'ın nasıl bir result döndürüyor veya döndürdüğüne eminmisin ? Apikey'inde sıkıntı olabilir.
picture-7617-1421911538.jpg
sametgunduz
15.11.2014 - 11:24

JSON Parse işlemini asynctask yapısıyla denemenizde fayda var; aşağıdaki örneğin işinize yarıyacağını düşünüyorum ; 

[code]
public class MainActivity extends Activity {
  TextView uid;
  TextView name1;
  TextView email1;
  Button Btngetdata;
  //URL to get JSON Array
  private static String url = "http://10.0.2.2/JSON/";
  //JSON Node Names
  private static final String TAG_USER = "user";
  private static final String TAG_ID = "id";
  private static final String TAG_NAME = "name";
  private static final String TAG_EMAIL = "email";
  JSONArray user = null;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Btngetdata = (Button)findViewById(R.id.getdata);
        Btngetdata.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
             new JSONParse().execute();
      }
    });
    }
    private class JSONParse extends AsyncTask<String, String, JSONObject> {
       private ProgressDialog pDialog;
      @Override
        protected void onPreExecute() {
            super.onPreExecute();
             uid = (TextView)findViewById(R.id.uid);
       name1 = (TextView)findViewById(R.id.name);
       email1 = (TextView)findViewById(R.id.email);
            pDialog = new ProgressDialog(MainActivity.this);
            pDialog.setMessage("Getting Data ...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
      }
      @Override
        protected JSONObject doInBackground(String... args) {
        JSONParser jParser = new JSONParser();
        // Getting JSON from URL
        JSONObject json = jParser.getJSONFromUrl(url);
        return json;
      }
       @Override
         protected void onPostExecute(JSONObject json) {
         pDialog.dismiss();
         try {
            // Getting JSON Array
            user = json.getJSONArray(TAG_USER);
            JSONObject c = user.getJSONObject(0);
            // Storing  JSON item in a Variable
            String id = c.getString(TAG_ID);
            String name = c.getString(TAG_NAME);
            String email = c.getString(TAG_EMAIL);
            //Set JSON Data in TextView
            uid.setText(id);
            name1.setText(name);
            email1.setText(email);
        } catch (JSONException e) {
          e.printStackTrace();
        }
       }
    }
}
[/code]

Hulusi Dinç
15.11.2014 - 12:02
Bunu kendime uyarlayıp denedim ancak Progress Dialog un tamamlanmasından sonra yine çöktü.