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

异步任务的实现

狄玉书
2023-03-14

我试图在这个类中实现异步任务,但问题是我在我的程序中调用了getInputStream函数,该函数返回一个值,我不知道该把它放在哪里。在异步任务中,我应该在哪里定义getInputStream?我得到以下例外

FATAL EXCEPTION: main
java.lang.RuntimeException: Unable to start activity      com.sparkplug.xxxx}: java.lang.NullPointerException

以下是我的主要课程:

public class abcreaderextends ListActivity {

    ArrayList<HashMap<String, String>> menuItems = new ArrayList<HashMap<String, String>>();

    parsing p=new parsing();

        @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_awsreader);
        ((PullToRefreshListView) getListView())
                .setOnRefreshListener(new OnRefreshListener() {
                    public void onRefresh() {
                        // Do work to refresh the list here.
                        new GetDataTask().execute();
                    }
                });
        InputStreamOperation in= new InputStreamOperation();

        in.execute();

        //p.parse();

        for (int i = 0; i < p.headlines.size(); i++) {
            // creating new HashMap
            HashMap<String, String> map = new HashMap<String, String>();
            // adding each child node to HashMap key => value
            map.put("title", p.headlines.get(i));
            map.put("dcdate", p.lstDate.get(i));
            map.put("description", p.description.get(i));
            // adding HashList to ArrayList
            menuItems.add(map);
        }

                ListAdapter rssFeedSection = new SimpleAdapter(this, menuItems,
                R.layout.list_item, new String[] { "title", "dcdate",
                        "description" }, new int[] { R.id.name, R.id.date1,
                        R.id.desc });
        setListAdapter(rssFeedSection);
    }

    class GetDataTask extends AsyncTask<Void, Void, String[]> {
        @Override
        protected void onPostExecute(String[] result) {
            // **menuItems.addFirst("Added after refresh...");
            // Call onRefreshComplete when the list has been refreshed.
            ((PullToRefreshListView) getListView()).onRefreshComplete();
            super.onPostExecute(result);
        }

        @Override
        protected String[] doInBackground(Void... params) {
            // TODO Auto-generated method stub
            return null;
        }
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Uri uri = Uri.parse((String) p.links.get(position));
        Intent intent = new Intent(Intent.ACTION_VIEW, uri);
        startActivity(intent);
    }
}

这是我的解析类:公共类解析{ List headlines列出链接;列表描述;列出lstDate列出新日期;//字符串a,b,c,d;public InputStream getInputStream(URL URL){ try { return URL . open connection()。getInputStream();} catch (IOException e) {返回null} }

    public HashMap<String, ArrayList<String>> parse() {

        // Initializing instance variables
        headlines = new ArrayList<String>();
        links = new ArrayList<String>();
        description = new ArrayList<String>();
        lstDate = new ArrayList<String>();
        try {
            URL url = new URL(
                    "http://feeds.feedburner.com/xxxx");
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(false);
            XmlPullParser xpp = factory.newPullParser();
            // We will get the XML from an input stream
            xpp.setInput(getInputStream(url), "UTF_8");
            int i = 0;
            boolean insideItem = false;
            // Returns the type of current event: START_TAG, END_TAG, etc..
            int eventType = xpp.getEventType();
            int k = 0;
            while (eventType != XmlPullParser.END_DOCUMENT) {
                i++;
                // Log.i("Tag : ",xpp.getName().toString());
                // Log.i("Text : ",xpp.nextText().toString());
                if (eventType == XmlPullParser.START_TAG) {
                    Log.i("Tag : ", xpp.getName().toString());
                    // Log.i("Text : ",xpp.nextText().toString());
                    if (xpp.getName().equalsIgnoreCase("item")) {
                        insideItem = true;
                    } else if (xpp.getName().equalsIgnoreCase("title")) {
                        if (insideItem) {
                            String var = xpp.nextText().toString();
                            headlines.add(var); // extract the description of
                                                // article
                            Log.i("Title : ", var);
                            // Log.i("Count : ",i+"");
                        }
                    } else if (xpp.getName().equalsIgnoreCase("description")) {
                        if (insideItem) {
                            String desc = xpp.nextText().toString();
                            description.add(desc); // extract the description of
                                                    // article
                            Log.i("Desc : ", desc);
                        }
                    } else if (xpp.getName().equalsIgnoreCase("dc:date")) {
                        if (insideItem) {
                            String strDate = xpp.nextText().toString();

                            System.out.println("rahul"+strDate.substring(0,10));
                            //lstDate = Arrays.asList(arr[k].substring(0,10));
                            lstDate.add(strDate.substring(0,10));
                            System.out.println("lstDate"+lstDate);
                            k = k+1;
                            Log.i("Date : ", strDate);
                        }
                    } else if (xpp.getName().equalsIgnoreCase("link")) {
                        if (insideItem)
                            links.add(xpp.nextText()); // extract the link of
                                                        // article
                    }
                } else if (eventType == XmlPullParser.END_TAG
                        && xpp.getName().equalsIgnoreCase("item")) {
                    insideItem = false;
                }
                eventType = xpp.next(); // move to next element
            }// While end
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        HashMap<String, ArrayList<String>> alllists = 
                                        new HashMap<String, ArrayList<String>>();
        alllists.put("headlines",(ArrayList<String>) headlines);
        alllists.put("links",(ArrayList<String>) links);
        alllists.put("description",(ArrayList<String>) description);
        alllists.put("lstDate",(ArrayList<String>) lstDate);

        return alllists;
        }
}

这个是我的InputStreamAction类:公共类InputStreamAction扩展了AsyncTask

@Override
protected void onPreExecute() {
// show progress bar here(have not used any progress bar)
}

@Override
protected HashMap<String, ArrayList<String>> 
                           doInBackground(Void... params) {

//call parse() method here
parsing parsingobj=new parsing();
HashMap<String, ArrayList<String>> alllists=parsingobj.parse();

return alllists;  //<<< retun final result from here

}      

@Override
protected void onPostExecute(HashMap<String, ArrayList<String>> result) {  
// update UI here            
}

}

共有3个答案

翁宜年
2023-03-14

它应该用doInbackground()方法编写。

由于格式问题,我不能上传准确的代码

1 创建一个类,使用 2 写入 getInputStream in doInBackground 3 调用 asynctask 以获取 InputStream

赵晟睿
2023-03-14

你需要调用getInputStream里面的doInbackground方法的AsyncTask为:

首先,将parse方法返回类型更改为<code>HashMap

public HashMap<String, ArrayList<String>> parse() {

 ///your code here...

HashMap<String, ArrayList<String>> alllists = 
                                new HashMap<String, ArrayList<String>>();
alllists.put("headlines",headlines);
alllists.put("links",links);
alllists.put("description",description);
alllists.put("lstDate",lstDate);

return alllists;
}

并将AsyncTask类创建为:

private class InputStreamOperation extends 
                    AsyncTask<String, Void, HashMap<String, ArrayList<String>>> {

      @Override
      protected void onPreExecute() {
        // show progress bar here
      }

      @Override
      protected HashMap<String, ArrayList<String>> 
                                               doInBackground(String... params) {

           //call parse() method here
          parsing parsingobj=new parsing();
          HashMap<String, ArrayList<String>> alllists=parsingobj.parse();

          return alllists;  //<<< retun final result from here

      }      

      @Override
      protected void onPostExecute(HashMap<String, ArrayList<String>> result) {  
              // update UI here            
      }


}
时向文
2023-03-14

像这样试试..

class Search AsyncTask<String, Void, ArrayList<Movie>>() {

                @Override
                protected void onPreExecute() {
                    progressDialog= ProgressDialog.show(context, "Please Wait","Searching movies", true);
                }

                @Override
                protected ArrayList<Movie> doInBackground(String... params) {
                    String moviesJson = retrieveStream[params[0]];
                    JSONObject moviesJson = new JSONObject(moviesJson);
                    ArrayList<Movie> movies = new ArrayList<Movie>();
                    /*
                     * Do your code to process the JSON and create an ArrayList of films.
                     * It's just a suggestion how to store the data.
                     */
                    return movies;
                }

                protected void onPostExecute(ArrayList<Movie> result) {
                    progressDialog.dismiss();
                    //create a method to set an ArrayList in your adapter and set it here.
                    sampleActivity.mListAdapter.setMovies(result);
                    sampleActivity.mListAdapter.notifyDataSetChanged();
                }
            }

如需更多信息...

Android的AsyncTask和InputStream问题

 类似资料:
  • 问: 如何异步处理繁重的业务,避免主业务被长时间阻塞。例如我要给1000用户发送邮件,这个过程很慢,可能要阻塞数秒,这个过程中因为主流程被阻塞,会影响后续的请求,如何将这样的繁重任务交给其它进程异步处理。 答: 可以在本机或者其它服务器甚至服务器集群预先建立一些任务进程处理繁重的业务,任务进程数可以开多一些,例如cpu的10倍,然后调用方利用AsyncTcpConnection将数据异步发送给这些

  • 主要内容:本节引言:,1.相关概念,2.AsyncTask全解析:,3.AsyncTask使用示例:,本节小结:本节引言: 本节给大家带来的是Android给我们提供的一个轻量级的用于处理异步任务的类:AsyncTask,我们一般是 继承AsyncTask,然后在类中实现异步操作,然后将异步执行的进度,反馈给UI主线程~ 好吧,可能有些概念大家不懂,觉得还是有必要讲解下多线程的概念,那就先解释下一些概念性的东西吧! 1.相关概念 1)什么是多线程: 答:先要了解这几个名称:应用程序,进程,线程,

  • 本文向大家介绍Android AsyncTack 异步任务实例详解,包括了Android AsyncTack 异步任务实例详解的使用技巧和注意事项,需要的朋友参考一下 Android AsyncTack 异步任务               这里写一个小实例,来学习巩固Android AsyncTack 异步任务的知识,以便在项目中使用。 介绍一下如何使用 1, 继承AsyncTask publi

  • 这可能是一个更巧妙的问题,但我在ViewComponent类中有以下方法 所以我的问题是我应该采取什么方法?让异步在那里与警告无关,还是有一个解决方案/修复这个警告?它对我的项目有那么大的影响吗? 谢了!

  • 本文向大家介绍Django异步任务线程池实现原理,包括了Django异步任务线程池实现原理的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Django异步任务线程池实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 当数据库数据量很大时(百万级),许多批量数据修改请求的响应会非常慢,一些不需要即时响应的任务可以放到后台的异步线程中

  • 问: 如何异步处理繁重的业务,避免主业务被长时间阻塞。例如我要给1000用户发送邮件,这个过程很慢,可能要阻塞数秒,这个过程中因为主流程被阻塞,会影响后续的请求,如何将这样的繁重任务交给其它进程异步处理。 答: 可以在本机或者其它服务器甚至服务器集群预先建立一些任务进程处理繁重的业务,任务进程数可以开多一些,例如cpu的10倍,然后调用方利用AsyncTcpConnection将数据异步发送给这些