当前位置: 首页 > 知识库问答 >
问题:

OnPostExecute不提供类的上下文

冀翰翮
2023-03-14

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

麹高远
2023-03-14

您对AsyncTask的实现不正确。您将泛型类型指定为

将其更改为以下内容

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

这也给你一个例外,当你在后执行

郤飞英
2023-03-14
private class DownloadXmlTask extends AsyncTask<String, Void, Object>

在这一行中,您定义了3件事。

String传递给受保护对象doInBackground(字符串…URL)的参数类型。这是正确的。

Void传递给protected的参数的类型在ProgressChanged(整数...值)。你没有使用这种方法,所以应该没问题。

Object传递给protectedvoid onPostExecute(列表)的参数类型

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

protected void onPostExecute(Object results)

或更改AsyncWork

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

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

 类似资料:
  • 我是新手,我想在我的课上注入上下文和网络(使用改型)。 这是我到目前为止的代码: 这是我的组件: 但是我如何在应用程序类中使用注入器,这是没有意义的

  • 我正在使用aws无服务器java容器将Jersey服务包装到aws Lambda中。我决定使用函数别名进行“测试”和“生产”阶段,最终指向lambda函数的不同版本。 我需要在中选择一些属性。基于该别名的属性文件,基本上是因为我需要与“test”或“prod”DB对话,或者使用不同的endpoint来调用外部web服务。 为此,我需要调用Context对象的方法getInvokedFunction

  • 我被这个问题困扰了两天了。我已经检查了这个论坛和其他论坛,但不能得到一个问题或答案,足够接近我的问题。 基本上,我试图从非活动的执行的意图,我从MainActivity中的方法中的函数发送上下文(mainActivty.this)和字符串。这将转到非activity中的一个构造函数,该构造函数具有上下文和字符串的参数。 问题是,我得到了一个空异常,但调试后,上下文不是空的,它具有MainActiv

  • 我包括7个错误,都是实现错误??这些代码是在知识有限的情况下,1比1地从主要活动转换成片段的,我找到了一些解决方案,但仍然不知道如何应用到我的代码中。

  • ParameterResolver defines the Extension API for dynamically resolving parameters at runtime. If a test class constructor, test method, or lifecycle method (see Test Classes and Methods) declares a par

  • 我尝试将这个项目部署到AWS弹性豆茎:https://github.com/coralproject/talk,dockerfile公开端口5000,我也定义了环境变量,所有这些变量都使用端口5000。 可能相关的日志: /var/log/eb-activity.log cat://var/app/current/dockerrun.aws.json:没有这样的文件或目录8C17e6ddb0f84