title: ListView from AsyncTask and JSONParser
body: <p>I'm going to fetch news from json on my server.</p>
  
  <p>Also I have a menu button that refresh my listview.</p>
  
  <p>I don't know where I'm wrong !!!</p>
  
  <p><strong>JSON file</strong> <code>(http://10.0.2.2:8020/test/index.php)</code></p>
  
  <pre><code>{
  "news":
  [
      {"id":"1","title":"Number one","description":"This is First Message","created_at":"2014-04-04"},
      {"id":"2","title":"Number two","description":"This is Second Message","created_at":"2014-04-04"},
      {"id":"3","title":"Number three","description":"This is Third Message","created_at":"2014-04-04"}
  ]
  }
  </code></pre>
  
  <p><strong>JSONParser.java</strong></p>
  
  <pre><code>package com.example.myapp.library;
  
  import java.io.BufferedReader;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.InputStreamReader;
  import java.io.UnsupportedEncodingException;
  import org.apache.http.HttpEntity;
  import org.apache.http.HttpResponse;
  import org.apache.http.client.ClientProtocolException;
  import org.apache.http.client.methods.HttpPost;
  import org.apache.http.impl.client.DefaultHttpClient;
  import org.json.JSONException;
  import org.json.JSONObject;
  
  public class JSONParser {
  
  static InputStream is = null;
  static JSONObject jObj = null;
  static String json = "";
  
  public JSONParser() {}
  
  public JSONObject getJSONFromUrl(String url)
  {
      /**
       * Making Http Request
       */
      try
      {
          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();
      }
      /**
       * JSON retreive value 
       */
      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)
      { e.printStackTrace(); }
      /**
       * Parse the String to JSON OBJECT 
       */
      try
      {   jObj = new JSONObject(json);  }
      catch (JSONException e)
      {   e.printStackTrace();    }
      /**
       * Return JSON Object
       */
      return jObj;    
  }
  }
  </code></pre>
  
  <p><strong>RefreshNews.java</strong></p>
  
  <pre><code>package com.example.myapp.library;
  
  import com.example.myapp.adapter.NewsListAdapter;
  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;
  import android.app.Activity;
  import android.app.ProgressDialog;
  import android.os.AsyncTask;
  import android.widget.ListView;
  import android.widget.Toast;
  
  public class RefreshNews extends AsyncTask&lt;Void,Void,Void&gt; {
  
  private String url;
  private ListView listView;
  private Activity context;
  /////////////////////////
  private JSONParser jsonParser;
  private JSONObject jObj;
  private NewsListAdapter myAdapter;
  private ProgressDialog pDialog;
  //////////////////////////////////
  private static final String TAG_NEWS = "news";
  private static final String TAG_TITLE = "title";
  private static final String TAG_DESCRIPTION = "description";
  private static final String TAG_CREATED_AT = "created_at";
  ////////////////////////////////////////////////////////////
  private String[] title;
  private String[] description;
  private String[] created_at;
  
  
  /**
   * Constructor
   **/
  public RefreshNews(Activity context, ListView listView, String url)
  {
      this.context = context;
      this.listView = listView;
      this.url = url;
  }
  
  @Override
  protected void onPreExecute() {
      pDialog = new ProgressDialog(context);
      pDialog.setCancelable(false);
      pDialog.setMessage("Loading ...");
      pDialog.show();
      super.onPreExecute();
  }
  
  @Override
  protected Void doInBackground(Void... arg0) {
      jsonParser = new JSONParser();
      jObj = jsonParser.getJSONFromUrl(url);
      try 
      {
          JSONArray News = jObj.getJSONArray(TAG_NEWS);
          for(int i=0; i&lt;News.length(); i++)
          {
              JSONObject temp = News.getJSONObject(i);
              title[i] = temp.getString(TAG_TITLE);
              description[i] = temp.getString(TAG_DESCRIPTION);
              created_at[i] = temp.getString(TAG_CREATED_AT);
          }
  
      } 
      catch (JSONException e) 
      {
              Toast.makeText(context, "Error in doInBackground ...", 5000).show();
      }
      return null;
  }
  
  @Override
  protected void onPostExecute(Void result) {
      myAdapter = new NewsListAdapter(context, title, description, created_at);
      listView.setAdapter(myAdapter);
      pDialog.dismiss();
      super.onPostExecute(result);
  }
  
  }
  </code></pre>
  
  <p><strong>MainActivity.java</strong></p>
  
  <pre><code>package com.example.myapp;
  
  import com.example.myapp.library.RefreshNews;
  import android.os.Bundle;
  import android.app.Activity;
  import android.view.Menu;
  import android.view.MenuItem;
  import android.widget.ListView;
  
  public class MainActivity extends Activity {
  
  private static final String url = "http://10.0.2.2:8020/test/index.php";
  
  ListView list;
  
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      list = (ListView) findViewById(R.id.listView1);
  
  }
  
  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
      // Inflate the menu; this adds items to the action bar if it is present.
      getMenuInflater().inflate(R.menu.main, menu);
      return true;
  }
  
  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
      if(item.getItemId() == R.id.action_refresh)
      {
          RefreshNews refreshNews = new RefreshNews(MainActivity.this, list, url);
          refreshNews.execute();
      }
      return super.onOptionsItemSelected(item);
  }
  
  }
  </code></pre>
  
  <p><strong>Manifest.xml</strong></p>
  
  <pre><code>&lt;uses-permission android:name="android.permission.INTERNET"/&gt;
  </code></pre>
  
  <p>Any suggestion would be appreciated ...</p>
  
  <p><strong>LogCat:</strong></p>
  
  <pre><code>10-19 04:34:15.215: W/System.err(13788): org.json.JSONException: Expected ':' after n at character 4 of {n  "news":n    [n      {"id":"1","title":"Number one","description":"This is First Message","created_at":"2014-04-04"},n       {"id":"2","title":"Number two","description":"This is Second Message","created_at":"2014-04-04"},n      {"id":"3","title":"Number three","description":"This is Third Message","created_at":"2014-04-04"}n  ]n}nn
  </code></pre>
  
  <p><strong>UPDATE:</strong></p>
  
  <p>It seems that my <strong>JSON</strong> is wrong. I've edited my <strong>JSONParser</strong> class:</p>
  
  <pre><code>sb.append(line + "n");   ----&gt;    sb.append(line + "\n");
  </code></pre>
  
  <p>But error has been occurring yet!</p>
  
  <p>Is there any suggestion(s) ?!</p>