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