在我的AsyncTask
中,我在doInBackground()
内执行了相当长的操作,该操作在完成doInBackground()
后为变量赋值。
我使用该变量的值来设置postExecute()
中用户界面的一部分。
问题是doinbackground()
是一个很长的操作,postExecute()
首先完成。这样我就无法获得价值。
这里有什么问题
private class bigwork extends AsyncTask<String, Void, Boolean> {
String foo = null;
@Override
protected void onPreExecute() {
}
@Override
protected Boolean doInBackground(final String... args) {
// Long operation sets variable 'foo' a new value
}
@Override
protected void onPostExecute(final Boolean success) {
// Make use of foo here
}
问题是我foo
postExecute()
的价值仍为null
。
答案 0 :(得分:0)
通常你会将String直接传递给onPostExecute:
private class bigwork extends AsyncTask<String, Void, String>
{
@Override
protected void onPreExecute() {
}
@Override
protected Boolean doInBackground(final String... args) {
// Long operation
set variable 'foo' a new value
return foo;
}
@Override
protected void onPostExecute(String foo) {
if (foo != null) {
// success
}
// Make use of foo here
}
答案 1 :(得分:0)
您应该将参数直接传递给onPostExecute。引自Android Developer Reference:
protected void onPostExecute(结果结果) 在doInBackground(Params ...)之后在UI线程上运行。指定的结果是doInBackground(Params ...)返回的值。
如果您需要传递多个参数,请将它们包装在类:
中public class MyClass
{
public String string1;
public String string2;
public MyClass(String a, String b){
string1 = a;
string2 = b;
}
}
希望这有帮助。
最好的问候。
答案 2 :(得分:0)
覆盖onPostExecute()函数,在doInBackground()函数完成后执行一些任务。就像这样:
@Override
protected String doInBackground(String... arg0) {
// TODO Auto-generated method stub
ServiceHandler sh = new ServiceHandler();
jsonStr=sh.makeServiceCall(arg0[0], ServiceHandler.GET);
return null;
}
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
Log.i("jsin", jsonStr);
if(pd.isShowing()){
pd.dismiss();
}
try {
js = new JSONObject(jsonStr);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
JSONArray results =null;
try {
results = js.getJSONArray("results");
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
for(int i = 0; i< results.length();i++)
{
JSONObject c = null;
try {
c = results.getJSONObject(i);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
placeName = c.getString(TAG_NAME);
ratings = c.getDouble(TAG_RATING);
HashMap<String, String> rest = new HashMap<String, String>();
rest.put(TAG_NAME, placeName);
rest.put(TAG_RATING, ratings+"");
placeList.add(rest);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
ListAdapter adapter = new SimpleAdapter(getActivity().getApplicationContext(), placeList, R.layout.list_item, new String[]{TAG_NAME}, new int[]{R.id.list_text});
lv.setAdapter(adapter);
}
我正在我的doInBackground中发出http请求,成功回复后我在onPostExecute()中解析json并在listview中显示,显然这段代码在类中扩展了AsyncTask类。