0

我正在尝试使用 AsyncTask 完成一些任务。但是当我完成它时。它没有显示任何类型的语法错误。但是在运行时它显示错误,如下图所示

我试图调试它,但可以得到问题所在。请帮忙

JsonParsingActivity.java

import java.util.ArrayList;
import java.util.HashMap;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListAdapter;
import android.widget.SimpleAdapter;

public class AndroidJSONParsingActivity extends ListActivity {

    final String TAG_PRODUCTS = "products";
    final String TAG_CID = "cid";
    final String TAG_NAME = "name";

    JSONArray products = null;
    ArrayList<HashMap<String, String>> contactList = new ArrayList<HashMap<String, String>>();
    // Creating JSON Parser instance
    JSONParser jParser = new JSONParser();
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        new Message().execute(this);
        // The service section
        startService(new Intent(this, UpdateService.class));

        /**
         * Updating parsed JSON data into ListView
         * */
        ListAdapter adapter = new SimpleAdapter(this, contactList,
                R.layout.list_item,
                new String[] { TAG_NAME,}, new int[] {
                        R.id.name});

        setListAdapter(adapter);


    }

@Override
    protected void onStart() {
        // TODO Auto-generated method stub
        super.onStart();
        new Message().execute(this);

        ListAdapter adapter = new SimpleAdapter(this, contactList,
                R.layout.list_item,
                new String[] {TAG_NAME,}, new int[] {
                        R.id.name});

        setListAdapter(adapter);

    }
    //Belongs to update service
    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
//      stopService(new Intent(this, UpdateService.class));
    }

    class Message extends AsyncTask<Context, Integer, Long>{

        @Override
        protected Long doInBackground(Context... params) {
            // TODO Auto-generated method stub

                String url = "http://ensignweb.com/sandbox/app/comment11.php";
                            // getting JSON string from URL
                JSONObject json = jParser.getJSONFromUrl(url);

                try {
                    // Getting Array of Contacts
                    products = json.getJSONArray(TAG_PRODUCTS);

                    // looping through All Contacts
                    for(int i = products.length()-1; i >=0; i--){
                        JSONObject c = products.getJSONObject(i);

                        // Storing each json item in variable
                        String cid = c.getString(TAG_CID);
                        String name = c.getString(TAG_NAME);
                        // creating new HashMap
                        HashMap<String, String> map = new HashMap<String, String>();

                        // adding each child node to HashMap key => value
                        map.put(TAG_CID, cid);
                        map.put(TAG_NAME, name);

                        // adding HashList to ArrayList
                        contactList.add(map);
                        Log.d("value", contactList.toString());
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
                return null;
        }
    }

}

它显示为 InnerSetException 和 setException。

4

3 回答 3

0

InnerSetException and setExceptionraise to provided 让您将结果设置为异常。

您必须重写该done()方法并尝试获得结果。

 @Override
    protected void done() {
        try {
            if (!isCancelled()) get();
        } catch (ExecutionException e) {
            //If Exception occurred, handle it.

        } catch (InterruptedException e) {
           throw new AssertionError(e);
        }
    }
于 2013-01-09T07:43:31.503 回答
0

像这样更改您的 AsyncTask:

class Message extends AsyncTask<Void, Void, Void>{

     @Override
     protected Void doInBackground(Void... params) {
        // Your woriking

         return null;            
     }

    @Override
    protected void onPostExecute(Void result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);

    ListAdapter adapter = new SimpleAdapter(this, contactList,
            R.layout.list_item,
            new String[] { TAG_NAME,}, new int[] {
                    R.id.name});

    setListAdapter(adapter);         
 }
于 2013-01-09T07:25:42.277 回答
0

在类 Message 中的 postExecute()(overridden method) 方法中使用它

ListAdapter adapter = new SimpleAdapter(this, contactList,
            R.layout.list_item,
            new String[] { TAG_NAME,}, new int[] {
                    R.id.name});

    setListAdapter(adapter);
于 2013-01-09T07:21:17.510 回答