0

我有一个要求,我需要以 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;
}
4

2 回答 2

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);
于 2013-04-01T09:09:15.540 回答
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 的架构应该是这样的:

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);
        }

    }
于 2013-04-01T09:33:11.187 回答