AsyncTask在runInBackground中给出错误

时间:2013-01-09 07:18:29

标签: android android-asynctask

我正在尝试使用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。

3 个答案:

答案 0 :(得分:0)

在类Message

中的postExecute()(重写方法)方法中使用它
ListAdapter adapter = new SimpleAdapter(this, contactList,
            R.layout.list_item,
            new String[] { TAG_NAME,}, new int[] {
                    R.id.name});

    setListAdapter(adapter);

答案 1 :(得分: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);         
 }

答案 2 :(得分:0)

InnerSetException and setException提升以允许您将结果设置为异常。

您必须覆盖done()方法并尝试获取结果。

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

        } catch (InterruptedException e) {
           throw new AssertionError(e);
        }
    }