从asynctask,android json解析器返回数组列表

时间:2013-04-01 08:58:49

标签: android android-asynctask arrays

我有一个要求,我需要以JSON格式解析URL的内容。我能够成功地做到这一点。但我需要将URL的内容保存在数组列表中并将它们传递回调用函数。以下是我想要实现的代码片段。

@Override
protected ArrayList<String> onPostExecute(String result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
        dialog.dismiss();
        return ar; // ar is the arraylist i have created and updated it with the content of the url.
    }

但是运行它会产生错误。任何人都可以建议我如何使这成为可能。但是,当我将onPostExecute的返回类型设置为void并将内容干杯时,它会正确显示。当我在执行后调用它时,即使我更新了null中的内容,它也会返回doinbackground()。因此我无法获得arraylist格式的返回值。

// Calling function
Myadapter.execute();
ArrayList<string> str = new ArrayList<string>();
str = print();
// Here str is getting null

// Called function
    public ArrayList<String> print() {
    ArrayList<String> names = new ArrayList<String>();
    for(int i=0;i<al.size();i++)
    {           
        names.add(al.get(i).getConstituencyName());         
    }
    return names;
}

2 个答案:

答案 0 :(得分:3)

使用处理程序

在您的活动中

 mHandler = new Handler() { 
   @Override public void handleMessage(Message msg) { 
      ArrayList s=(ArrayList)msg.obj;
      tv.setText("Result = "+s.get(0));

    }
  };    

在你的onPostexecute

 Message msg=new Message();
 msg.obj=ar;
 mHandler.sendMessage(msg);

答案 1 :(得分:1)

正确的方法是让你的活动实现一个接口,当你实例化AsyncTask时,将当前活动作为参数传递给构造函数。然后在onPostExecute()中调用Activity中定义的回调方法,并将json结果作为参数传递。

这样的事情:

interface OnTaskFinished {
    void onTaskFinished(String result);
}

public class MainActivity extends Activity implements OnTaskFinished {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // ....
        new MyAsyncTask(this).execute();

    }

    @Override
    public void onTaskFinished(String result) {
        // Process the json result here how you need.
    }
}

这就是AsyncTask的Scheleton应该是这样的:

private class MyAsyncTask extends AsyncTask<Void, Void, String> {

        private final OnTaskFinished listener;

        public MyAsyncTask(OnTaskFinished listener) {
            this.listener = listener;
        }

        // ...

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            listener.onTaskFinished(result);
        }

    }