如何在android中应用Asynctask和jsonparsing
我正在android中使用json解析应用asynctask,但它可以显示错误。 我的代码是如何在android中应用Asynctask和jsonparsing,android,json,android-layout,android-intent,Android,Json,Android Layout,Android Intent,我正在android中使用json解析应用asynctask,但它可以显示错误。 我的代码是 public class AndroidJSONParsingActivity extends ListActivity { // url to make request private static final String url = "http://203.110.93.84/trainee/yoga_api.php?category"; // JSON Node n
public class AndroidJSONParsingActivity extends ListActivity {
// url to make request
private static final String url = "http://203.110.93.84/trainee/yoga_api.php?category";
// JSON Node names
// Hashmap for ListView
ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
private static final String TAG_ID = "id";
private static final String TAG_NAME = "yoga_name";
private static final String TAG_CATEGORY = "category";
private static final String TAG_DESC = "yoga_desc";
private static final String TAG_URL = "yoga_url";
String gender;
// contacts JSONArray
JSONArray contacts = null;
Utility utility=new Utility();
String json;
private static String newurl="";
Boolean isInternetPresent = false;
// Connection detector class
ConnectionDetector cd;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
cd = new ConnectionDetector(getApplicationContext());
isInternetPresent = cd.isConnectingToInternet();
// check for Internet status
if (isInternetPresent) {
// Internet Connection is Present
// make HTTP requests
//showAlertDialog(AndroidDetectInternetConnectionActivity.this, "Internet Connection","You have internet connection", true);
Intent myIntent = getIntent();
newurl=url+"="+myIntent.getSerializableExtra("catname").toString();
} else {
// Internet connection is not present
// Ask user to connect to Internet
showAlertDialog(AndroidJSONParsingActivity.this, "No Internet Connection",
"You don't have internet connection.", false);
}
new Async().execute();
/*BackgroundAsyncTask task= new BackgroundAsyncTask();
task.execute();*/
// Creating JSON Parser instance
// JSONParser jParser = new JSONParser();
/**
* Updating parsed JSON data into ListView
* */
// selecting single ListView item
ListView lv = getListView();
// Launching new screen on Selecting Single ListItem
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// getting values from selected ListItem
String name = ((TextView) view.findViewById(R.id.name)).getText().toString();
String cost = ((TextView) view.findViewById(R.id.email)).getText().toString();
String description = ((TextView) view.findViewById(R.id.mobile)).getText().toString();
// Starting new intent
Intent in = new Intent(getApplicationContext(), SingleMenuItemActivity.class);
in.putExtra(TAG_NAME, name);
in.putExtra(TAG_DESC, cost);
in.putExtra(TAG_URL, description);
startActivity(in);
}
});
}
class Async extends AsyncTask<String, Integer, String> {
ProgressDialog dialog;
protected void onPreExecute()
{
dialog=new ProgressDialog(AndroidJSONParsingActivity.this);
dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
dialog.setTitle("Loading");
dialog.setMessage("Please Wait....");
dialog.show();
}
@Override
protected String doInBackground(String... params) {
// perform desired task in this doInBackground Block
jsonparser();
return "";
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
super.onProgressUpdate(values);
// dialog.incrementProgressBy(5);
}
@Override
protected void onPostExecute(String result)
{
dialog.dismiss();
}
}
public void jsonparser()
{
// getting JSON string from URL
JSONObject c=null;
try {
json = utility.getResponse(newurl);
// Toast.makeText(getApplicationContext(),json, Toast.LENGTH_LONG).show();
contacts = new JSONArray(json);
for(int i = 0; i < contacts.length(); i++){
c = contacts.getJSONObject(i);
// Storing each json item in variable
String id = c.getString(TAG_ID);
String name = c.getString(TAG_NAME);
String address = c.getString(TAG_DESC);
gender = c.getString(TAG_URL);
//Toast.makeText(getApplicationContext(),id, Toast.LENGTH_LONG).show();
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
// adding each child node to HashMap key => value
map.put(TAG_ID, id);
map.put(TAG_NAME, name);
map.put(TAG_DESC, address);
map.put(TAG_URL, gender);
// adding HashList to ArrayList
contactList.add(map);
}
} catch (UnsupportedEncodingException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClientProtocolException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
ListAdapter adapter = new SimpleAdapter(this, contactList,
R.layout.list_item,
new String[] { TAG_NAME, TAG_DESC, TAG_URL }, new int[] {
R.id.name, R.id.email, R.id.mobile });
setListAdapter(adapter);
}
}
公共类AndroidJSONParsingActivity扩展了ListActivity{
//发出请求的url
私有静态最终字符串url=”http://203.110.93.84/trainee/yoga_api.php?category";
//JSON节点名称
//ListView的Hashmap
ArrayList contactList=新建ArrayList();
私有静态最终字符串标记\u ID=“ID”;
私有静态最终字符串TAG_NAME=“yoga_NAME”;
私有静态最终字符串标记_CATEGORY=“CATEGORY”;
私有静态最终字符串标记_DESC=“yoga_DESC”;
私有静态最终字符串标记\u URL=“yoga\u URL”;
字符串性别;
//联系JSONArray
JSONArray联系人=null;
实用工具=新实用工具();
字符串json;
私有静态字符串newurl=“”;
布尔值isInternetPresent=false;
//连接检测器类
连接检测器cd;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
cd=新连接检测器(getApplicationContext());
isInternetPresent=cd.isConnectingToInternet();
//检查互联网状态
如果(isInternetPresent){
//存在Internet连接
//发出HTTP请求
//showAlertDialog(AndroidDetectionTernetConnectionActivity.this,“Internet连接”,“您有Internet连接”,true);
Intent myIntent=getIntent();
newurl=url+“=”+myIntent.getSerializableExtra(“catname”).toString();
}否则{
//Internet连接不存在
//要求用户连接到Internet
showAlertDialog(AndroidJSONParsingActivity.this,“无互联网连接”,
“您没有internet连接。”,false);
}
新建异步().execute();
/*BackgroundAsyncTask任务=新建BackgroundAsyncTask();
task.execute()*/
//创建JSON解析器实例
//JSONParser jParser=新的JSONParser();
/**
*将解析的JSON数据更新到ListView中
* */
//选择单个ListView项
ListView lv=getListView();
//在选择单个列表项时启动新屏幕
lv.setOnItemClickListener(新的OnItemClickListener(){
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//从选定的ListItem获取值
字符串名称=((TextView)view.findviewbyd(R.id.name)).getText().toString();
字符串成本=((TextView)view.findViewById(R.id.email)).getText().toString();
字符串描述=((TextView)view.findviewbyd(R.id.mobile)).getText().toString();
//开始新的意图
Intent in=新的Intent(getApplicationContext(),SingleMenuItemActivity.class);
in.putExtra(标签名称、名称);
额外费用(标签说明、成本);
in.putExtra(标记URL、说明);
星触觉(in);
}
});
}
类Async扩展了AsyncTask{
进程对话;
受保护的void onPreExecute()
{
dialog=newprogressdialog(AndroidJSONParsingActivity.this);
setProgressStyle(ProgressDialog.STYLE_微调器);
对话框.setTitle(“加载”);
setMessage(“请稍候…”);
dialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
//在此doInBackground块中执行所需任务
jsonparser();
返回“”;
}
@凌驾
受保护的void onProgressUpdate(整型…值){
//TODO自动生成的方法存根
super.onProgressUpdate(值);
//对话框。递增进度(5);
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
dialog.dismise();
}
}
public void jsonparser()
{
//从URL获取JSON字符串
JSONObject c=null;
试试{
json=utility.getResponse(newurl);
//Toast.makeText(getApplicationContext(),json,Toast.LENGTH_LONG.show();
联系人=新的JSONArray(json);
对于(int i=0;ivalue
地图放置(标签标识,标识);
地图放置(标签名称、名称);
地图放置(标签描述、地址);
地图放置(标签URL,性别);
//将哈希列表添加到ArrayList
联系人列表。添加(地图);
}
}捕获(不支持DencodingException e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}捕获(客户端协议例外e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}捕获(异常e1){
//TODO自动生成的捕捉块
e1.printStackTrace();
}
ListAdapter=新的SimpleAdapter(此,contactList,
R.layout.list_项目,
新字符串[]{TAG_NAME,TAG_DESC,TAG_URL},新int[]{
R.id.name,R.id.email,
02-23 16:16:16.616: D/dalvikvm(946): GC_FOR_MALLOC freed 2209 objects / 129344 bytes in 77ms
02-23 16:16:16.736: W/dalvikvm(946): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
02-23 16:16:16.756: E/AndroidRuntime(946): FATAL EXCEPTION: AsyncTask #1
02-23 16:16:16.756: E/AndroidRuntime(946): java.lang.RuntimeException: An error occured while executing doInBackground()
02-23 16:16:16.756: E/AndroidRuntime(946): at android.os.AsyncTask$3.done(AsyncTask.java:200)
02-23 16:16:16.756: E/AndroidRuntime(946): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-23 16:16:16.756: E/AndroidRuntime(946): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-23 16:16:16.756: E/AndroidRuntime(946): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-23 16:16:16.756: E/AndroidRuntime(946): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-23 16:16:16.756: E/AndroidRuntime(946): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
02-23 16:16:16.756: E/AndroidRuntime(946): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
02-23 16:16:16.756: E/AndroidRuntime(946): at java.lang.Thread.run(Thread.java:1096)
02-23 16:16:16.756: E/AndroidRuntime(946): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
02-23 16:16:16.756: E/AndroidRuntime(946): at android.view.ViewRoot.checkThread(ViewRoot.java:2802)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.view.ViewRoot.invalidateChild(ViewRoot.java:607)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.view.View.invalidate(View.java:5139)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.widget.AbsListView.resetList(AbsListView.java:1011)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.widget.ListView.resetList(ListView.java:493)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.widget.ListView.setAdapter(ListView.java:422)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.app.ListActivity.setListAdapter(ListActivity.java:267)
02-23 16:16:16.756: E/AndroidRuntime(946): at com.callplanets.app.AndroidJSONParsingActivity.jsonparser(AndroidJSONParsingActivity.java:204)
02-23 16:16:16.756: E/AndroidRuntime(946): at com.callplanets.app.AndroidJSONParsingActivity$Async.doInBackground(AndroidJSONParsingActivity.java:138)
02-23 16:16:16.756: E/AndroidRuntime(946): at com.callplanets.app.AndroidJSONParsingActivity$Async.doInBackground(AndroidJSONParsingActivity.java:1)
02-23 16:16:16.756: E/AndroidRuntime(946): at android.os.AsyncTask$2.call(AsyncTask.java:185)
02-23 16:16:16.756: E/AndroidRuntime(946): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-23 16:16:16.756: E/AndroidRuntime(946): ... 4 more
02-23 16:16:17.376: E/WindowManager(946): Activity com.callplanets.app.AndroidJSONParsingActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44ea7f00 that was originally added here
02-23 16:16:17.376: E/WindowManager(946): android.view.WindowLeaked: Activity com.callplanets.app.AndroidJSONParsingActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@44ea7f00 that was originally added here
02-23 16:16:17.376: E/WindowManager(946): at android.view.ViewRoot.<init>(ViewRoot.java:247)
02-23 16:16:17.376: E/WindowManager(946): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
02-23 16:16:17.376: E/WindowManager(946): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
02-23 16:16:17.376: E/WindowManager(946): at android.view.Window$LocalWindowManager.addView(Window.java:424)
02-23 16:16:17.376: E/WindowManager(946): at android.app.Dialog.show(Dialog.java:241)
02-23 16:16:17.376: E/WindowManager(946): at com.callplanets.app.AndroidJSONParsingActivity$Async.onPreExecute(AndroidJSONParsingActivity.java:132)
02-23 16:16:17.376: E/WindowManager(946): at android.os.AsyncTask.execute(AsyncTask.java:391)
02-23 16:16:17.376: E/WindowManager(946): at com.callplanets.app.AndroidJSONParsingActivity.onCreate(AndroidJSONParsingActivity.java:82)
02-23 16:16:17.376: E/WindowManager(946): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-23 16:16:17.376: E/WindowManager(946): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
02-23 16:16:17.376: E/WindowManager(946): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-23 16:16:17.376: E/WindowManager(946): at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-23 16:16:17.376: E/WindowManager(946): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-23 16:16:17.376: E/WindowManager(946): at android.os.Handler.dispatchMessage(Handler.java:99)
02-23 16:16:17.376: E/WindowManager(946): at android.os.Looper.loop(Looper.java:123)
02-23 16:16:17.376: E/WindowManager(946): at android.app.ActivityThread.main(ActivityThread.java:4627)
02-23 16:16:17.376: E/WindowManager(946): at java.lang.reflect.Method.invokeNative(Native Method)
02-23 16:16:17.376: E/WindowManager(946): at java.lang.reflect.Method.invoke(Method.java:521)
02-23 16:16:17.376: E/WindowManager(946): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
02-23 16:16:17.376: E/WindowManager(946): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
02-23 16:16:17.376: E/WindowManager(946): at dalvik.system.NativeStart.main(Native Method)
02-23 16:16:20.286: D/dalvikvm(956): GC_EXTERNAL_ALLOC freed 1053 objects / 70784 bytes in 83ms
cd = new ConnectionDetector(getApplicationContext());
isInternetPresent = cd.isConnectingToInternet();
// check for Internet status
if (isInternetPresent) {
// Internet Connection is Present
// make HTTP requests
//showAlertDialog(AndroidDetectInternetConnectionActivity.this, "Internet Connection","You have internet connection", true);
Intent myIntent = getIntent();
newurl=url+"="+myIntent.getSerializableExtra("catname").toString();
new Async().execute();
} else {
// Internet connection is not present
// Ask user to connect to Internet
showAlertDialog(AndroidJSONParsingActivity.this, "No Internet Connection",
"You don't have internet connection.", false);
}
@Override
protected void onPostExecute(String result)
{
dialog.dismiss();
ListAdapter adapter = new SimpleAdapter(this, contactList,
R.layout.list_item,
new String[] { TAG_NAME, TAG_DESC, TAG_URL }, new int[] {
R.id.name, R.id.email, R.id.mobile });
setListAdapter(adapter);
}