首页 文章

OnPostExecute没有给出类的上下文

提问于
浏览
2

我的公共类中有一个私有子类 . 这个私有类扩展了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 回答

  • 3

    您的 AsyncTask 实施不正确 . 您将泛型类型指定为 <String, Void, Object> ,但您的 onPostExecute 方法采用 List<StackOverflowXmlParser.entry> 类型的参数

    将其更改为以下内容

    private class DownloadXmlTask extends AsyncTask<String, Void, List<StackOverflowXmlParser.Entry>> {
        private Exception mException = null;
        private Context mContext
    
        public DownloadXmlTask(Context context) {
            mContext = context;
        }
    
        @Override
        protected List<StackOverflowXmlParser.Entry> doInBackground(String... urls) {
            try {
                return loadXmlFromNetwork(urls[0]);
            } catch (IOException e) {
                mException = e;
            } catch (XmlPullParserException e) {
                mException = e;
            }
    
            return null;
        }
    
        @Override
        protected void onPostExecute(List<StackOverflowXmlParser.Entry> results) {
            if (results != null && mException == null) {
              // Do your stuff
              // Rather use mContext as the context for your SimpleAdapter. Injection is always better.
            } else {
                if (mException instanceof IOException){
                  //Handle the IOException seperately
                } else if (mException instanceof XmlPullParserException) {
                  //Handle the XmlPullParserException seperately
                }
            }
        }
    }
    

    当你执行post时,这也会给你一个例外

  • 2
    private class DownloadXmlTask extends AsyncTask<String, Void, Object>
    

    在这一行中你定义了3件事 .

    String 传递给 protected Object doInBackground(String... urls) 的参数类型 . 这是对的 .

    Void 传递给 protected void onProgressChanged(Integer... values) 的参数类型 . 你没有使用这种方法所以应该没问题 .

    Object 传递给 protected void onPostExecute(List<StackOverflowXmlParser.Entry> results) 的参数类型 . 这是错的 . 你需要匹配这些 . 要么改变

    protected void onPostExecute(List<StackOverflowXmlParser.Entry> results)
    

    protected void onPostExecute(Object results)
    

    或者改变 AsyncTask<String, Void, Object>

    AsyncTask<String, Void, List<StackOverflowXmlParser.Entry>>
    

    然后,如果您这样做,您还必须更改 protected Object doInBackground(String... urls) 以将该返回类型与 onPostExecute() 期望的类型相匹配 . 你将在该方法中返回什么值取决于你(它必须与返回类型相匹配),我不会详细说明如何实现它 .

    另请参阅this answer中的图片:
    enter image description here

相关问题