我的公共类中有一个私有子类 . 这个私有类扩展了AsyncTask . 在onPostExecute()中,我必须通过自定义适配器发送我的对象列表 . 但问题是当我得到主公共类(私有子类的父)的“上下文”时,它会在@Override(OnPostExecute())上给出错误 .
public class MainListActivity extends ListActivity {
protected String[] mBlogPost;
public static final int NUMBER_OF_POST = 20;
public static final String TAG= MainListActivity.class.getSimpleName();
public void loadPage() {
Log.d(TAG,"loadpage me a gae nh");
// if((sPref.equals(ANY)) && (wifiConnected || mobileConnected)) {
new DownloadXmlTask().execute(URL);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main_list);
loadPage();
}
private class DownloadXmlTask extends AsyncTask<String, Void, Object> {
@Override
protected Object doInBackground(String... urls) {
try {
return loadXmlFromNetwork(urls[0]);
} catch (IOException e) {
return "I/O exception ae hy";
} catch (XmlPullParserException e) {
return "XML pull parser ke exception ae hy";
}
}
@Override
protected void onPostExecute(List<StackOverflowXmlParser.Entry> results) {
String title,link,summary;
ArrayList<HashMap<String,String>> blogPosts = new ArrayList<HashMap<String,String>>();
for(StackOverflowXmlParser.Entry result : results){
title = result.title;
link = result.link;
summary = result.summary;
HashMap<String,String> blogPost = new HashMap<String,String>();
blogPost.put("link",link);
blogPost.put("title",title);
//blogPost.put("summary",summary);
blogPosts.add(blogPost);
}
String[] keys = {"title","link"};
int[] ids = {android.R.id.text1,android.R.id.text2};
SimpleAdapter adapter =
new SimpleAdapter(MainListActivity.this,blogPosts,android.R.layout.simple_list_item_2,keys,ids);
setListAdapter(adapter);
}
它在@Override上给出了错误 . 我必须得到私有子类的父类的上下文(这扩展了asyncTask并具有onPostExecute())
我也使用了getApplicationContext() . 此外,我还为上下文创建了一个新的公共类,并从那里获取上下文 .
private Object loadXmlFromNetwork(String urlString) throws XmlPullParserException, IOException {
InputStream stream = null;
// Instantiate the parser
StackOverflowXmlParser stackOverflowXmlParser = new StackOverflowXmlParser();
List<StackOverflowXmlParser.Entry> entries = null;
String title = null;
String url = null;
String summary = null;
Calendar rightNow = Calendar.getInstance();
DateFormat formatter = new SimpleDateFormat("MMM dd h:mmaa");
StringBuilder htmlString = new StringBuilder();
try {
stream = downloadUrl(urlString);
entries = stackOverflowXmlParser.parse(stream);
// Makes sure that the InputStream is closed after the app is
// finished using it.
} finally {
if (stream != null) {
stream.close();
}
}
for (StackOverflowXmlParser.Entry entry : entries) {
htmlString.append("<p><a href='");
htmlString.append(entry.link);
htmlString.append("'>" + entry.title + "</a></p>");
htmlString.append(entry.summary);
}
for (StackOverflowXmlParser.Entry entry : entries)
{
Log.d(TAG, entry.link + " /" + entry.title);
}
//return htmlString.toString();
return entries;
}
2 回答
您的
AsyncTask
实施不正确 . 您将泛型类型指定为<String, Void, Object>
,但您的onPostExecute
方法采用List<StackOverflowXmlParser.entry>
类型的参数将其更改为以下内容
当你执行post时,这也会给你一个例外
在这一行中你定义了3件事 .
String
传递给protected Object doInBackground(String... urls)
的参数类型 . 这是对的 .Void
传递给protected void onProgressChanged(Integer... values)
的参数类型 . 你没有使用这种方法所以应该没问题 .Object
传递给protected void onPostExecute(List<StackOverflowXmlParser.Entry> results)
的参数类型 . 这是错的 . 你需要匹配这些 . 要么改变至
或者改变
AsyncTask<String, Void, Object>
然后,如果您这样做,您还必须更改
protected Object doInBackground(String... urls)
以将该返回类型与onPostExecute()
期望的类型相匹配 . 你将在该方法中返回什么值取决于你(它必须与返回类型相匹配),我不会详细说明如何实现它 .另请参阅this answer中的图片: