在AsyncTask中使用ProgressDailog时出错

时间:2014-08-05 06:06:06

标签: android progressdialog

我在解析XML数据时创建了Application。我想显示加载进度对话框。 我在ListActivity(MainClass)上创建了两个类,其他是下载(使用Asyntask在后台执行)。

我使用以下代码。

public class ListActivity extends Activity implements AsyncResponse {

    public ProgressDialog progressDialog;

    @Override
    public void onCreate(Bundle savedInstanceState) {

        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        progressDialog = new ProgressDialog(this);
        String url = "http://www.moneycontrol.com/rss/MCtopnews.xml";
        Download download = new Download();
        download.delegate = this;
        download.execute(url);

    }

    /*
     * After background task of download and parsing xml ArrayList received from
     * background task and send it to arrayAdapterzz
     */
    @Override
    public void processFinish(ArrayList<NewsItem> listArrayList) {
        ListView newsListView;

        newsListView = (ListView) findViewById(R.id.listView1);
        NewsListAdapter newsListAdapter = new NewsListAdapter(
                ListActivity.this, 0, listArrayList);
        newsListView.setAdapter(newsListAdapter);

    }
}


public class Download extends AsyncTask<String, Integer, ArrayList<NewsItem>> {
    public AsyncResponse delegate;
    private InputStream mInStream;
    private ArrayList<NewsItem> mNewsList;
    ListActivity la = new ListActivity();

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
        la.progressDialog.setMessage("Loading");
        la.progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        la.progressDialog.setProgress(0);
        la.progressDialog.show();
    }

    @Override
    protected ArrayList<NewsItem> doInBackground(String... params) {
        String urlstr = params[0];
    mInStream = downloadFromlUrl(urlstr);
    ParseXml parse = new ParseXml();
    try {
        mNewsList = parse.parseNewsFeed(mInStream);
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return mNewsList;
}

@Override
protected void onProgressUpdate(Integer... values) {
    // TODO Auto-generated method stub
    super.onProgressUpdate(values);
}

@Override
protected void onPostExecute(ArrayList<NewsItem> newsList) {
    // send back parsed data to ListActivity
    delegate.processFinish(newsList);
}

private InputStream downloadFromlUrl(String urlstr) {

    try {
        URL url = new URL(urlstr);

        HttpURLConnection connection = (HttpURLConnection) url
                .openConnection();
        connection.setConnectTimeout(10 * 1000);
        connection.setRequestMethod("GET");
        connection.connect();
        int response = connection.getResponseCode();
        Log.d("debug", "The response is: " + response);
        mInStream = connection.getInputStream();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return mInStream;

  }
}

我收到此错误

java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.rss/com.parse.ui.ListActivity}: java.lang.NullPointerException   
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1647)   
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1663)    
at android.app.ActivityThread.access$1500(ActivityThread.java:117)  
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:931)  
at android.os.Handler.dispatchMessage(Handler.java:99)  
at android.os.Looper.loop(Looper.java:123)  
at android.app.ActivityThread.main(ActivityThread.java:3683)    
at java.lang.reflect.Method.invokeNative(Native Method)     
at java.lang.reflect.Method.invoke(Method.java:507)     
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)  
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)     
at dalvik.system.NativeStart.main(Native Method) Caused by: java.lang.NullPointerException  
at com.parse.net.Download.onPreExecute(Download.java:33)    
at android.os.AsyncTask.execute(AsyncTask.java:391)     
at com.parse.ui.ListActivity.onCreate(ListActivity.java:30)     
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)  
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1611)   ... 11 more 08-05 06:08:02.113: I/Process(1852): Sending signal. PID: 1852 SIG: 9

2 个答案:

答案 0 :(得分:1)

这可能不是答案,而是一个概念。您不需要在ListActivity中添加ProgressDialog。

public ProgressDialog progressDialog;

并且无需在此实例化它。

因为你想显示AsycTask的进展,就像这样

public class ArticleTask extends AsyncTask<String, Void, JSONObject> {

    Activity context;

    ListView list_of_article;

    public ProgressDialog progressDialog;

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


    public ArticleTask(Activity coontext, ListView listview) {

        this.context = coontext;
        this.list_of_article = listview;
    }


    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();

        progressDialog = ProgressDialog.show(context,
                "", "");
    }

    @Override
    protected JSONObject doInBackground(String... params)
    {
        String response;

        try {

            HttpClient httpclient = new DefaultHttpClient();

            HttpPost httppost = new HttpPost(params[0]); //url

            HttpResponse responce = httpclient.execute(httppost);

            HttpEntity httpEntity = responce.getEntity();

            response = EntityUtils.toString(httpEntity);

            Log.d("response is", response);

            return new JSONObject(response);

        } catch (Exception ex) {

            ex.printStackTrace();

        }

        return null;
    }


    @Override
    protected void onPostExecute(JSONObject result)
    {
        super.onPostExecute(result);

        progressDialog.dismiss();

        if(result != null)
        {
            try
            {
                JSONObject jobj = result.getJSONObject("result");

                    JSONArray array = jobj.getJSONArray("data");

                    for(int x = 0; x < array.length(); x++)
                    {
                        HashMap<String, String> map = new HashMap<String, String>();

                        map.put("title", array.getJSONObject(x).getString("title"));

                        map.put("previewimage", array.getJSONObject(x).getString("previewimage"));

                        map.put("publishdate", array.getJSONObject(x).getString("publishdate"));

                        map.put("pagetext", array.getJSONObject(x).getString("pagetext"));

                        map.put("total_comments", array.getJSONObject(x).getString("total_comments"));

                        map.put("viewcount", array.getJSONObject(x).getString("viewcount"));

                        map.put("associatedthreadid", array.getJSONObject(x).getString("associatedthreadid"));

                        list.add(map);
                    }

                    ArticleAdapter adapter = new ArticleAdapter(context, list);

                    list_of_article.setAdapter(adapter);

            }
            catch (Exception e) 
            {
                e.printStackTrace();
            }
        }
        else
        {
            Toast.makeText(context, "Network Problem", Toast.LENGTH_LONG).show();
        }
    }


}

从ListActivity中移除ProgressDialog并在PreExecute上显示,然后在PostExecute上删除/取消它。

答案 1 :(得分:0)

preExecute()方法

中尝试此操作
@Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        super.onPreExecute();
progressDialog = ProgressDialog.show(this_context, "Loading",
                            "Please wait for a moment...");

    }