我將從我的服務器上從json獲取新聞。來自AsyncTask和JSONParser的ListView
另外我有一個菜單按鈕,刷新我的列表視圖。
我不知道我在哪裏錯了!
JSON文件(http://10.0.2.2:8020/test/index.php)
{
"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"}
]
}
JSONParser.java
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;
}
}
RefreshNews.java
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<Void,Void,Void> {
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<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);
}
}
MainActivity.java
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);
}
}
的Manifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
任何建議,將不勝感激......
logcat的:
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
UPDATE:
看來,我的JSON是錯誤的。我已經編輯我的JSONParser類:
sb.append(line + "n"); ----> sb.append(line + "\n");
但錯誤已經發生呢!
有什麼建議?
您收到的錯誤是什麼? – ucsunil 2014-10-19 22:10:04
我重定向到日食... 在調試窗口: 線程[<11>的AsyncTask#1](暫停(例外的RuntimeException)) ThreadPoolExecutor.runWorker(ThreadPoolExecuter $工人)線:1098 ThreadPoolExecuter $ Worker.run()行: 573 主題。運行()行:856 – 2014-10-19 22:27:25
你能否粘貼你收到的錯誤的完整堆棧跟蹤? – ucsunil 2014-10-20 00:35:26