0

我有一个进度对话框类,它是我的主要活动的子类。这本身运行良好。

public class UpdateFeedTask extends AsyncTask<Void, Void, Void> {

    ProgressDialog loading;
    @Override
    protected void onPreExecute() { 
        loading = ProgressDialog.show(NewsFeedActivity.this,"Please wait...", "Retrieving data ...", true);
    }

    @Override
    protected void onProgressUpdate(Void... progress) {

    }


    @Override
    protected void onPostExecute(Void result) {

        loading.dismiss();
    }

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

}

我有一个名为 getNews 的方法,它发送一个 http post 请求并解析结果,这需要几秒钟。在此方法中,我调用 UpdateFeedTask 以异步显示进度对话框,但它似乎不会同时进行。进度对话框似乎仅在 http 请求完成后才打开,因此它似乎首先完成了 getNews 方法,而不是显示进度对话框并发送请求,然后在一瞬间短暂显示进度对话框。如何在获取数据之前显示对话框?这是我如何调用进度对话框

public void getNews(){

            //show the progress dialog
    new UpdateFeedTask().execute();


    //go fetch some data
    WheruClient newsFeedLocation = new WheruClient();

    try {

        newsFeedArray = newsFeedLocation.getLocationActivity(sessionKey,page,filter,when);


    }catch (ClientProtocolException e) {
        Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show();
    } catch (IOException e) {
        Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show();
    }catch (JSONException e) {
        Toast.makeText(getApplicationContext(),e.getMessage(), Toast.LENGTH_LONG).show();
    }
}

**编辑新的异步类在后台发送 http 请求并返回 json 数组,但我收到一个致命错误,内容为

04-07 15:33:02.967: 错误/AndroidRuntime(11004): 由: java.lang.RuntimeException: 无法在未调用 Looper.prepare() 的线程内创建处理程序

我读了你的例子,我想我错过了一些关于在后台工作的东西,有什么想法吗?

public class UpdateFeedTask extends AsyncTask<Void, Void, JSONArray> {


    @Override
    protected void onPreExecute() { 
        //loading = ProgressDialog.show(NewsFeedActivity.this,"Please wait...", "Retrieving data ...", true);
    }

    @Override
    protected void onProgressUpdate(Void... progress) {

    }


    @Override
    protected void onPostExecute(JSONArray result) {

        //loading.dismiss();
        updateFeed(result);
    }

    @Override
    protected JSONArray doInBackground(Void... params) {

        WheruClient newsFeedLocation = new WheruClient();

        try {
            newsFeedArray = newsFeedLocation.getLocationActivity(sessionKey,page,filter,when);
        } catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return newsFeedArray;
    }

}
4

1 回答 1

1

需要在 doInBackground 中调用时间密集型任务。我在您的 doInBackground 方法中看不到任何内容。请注意,不要触摸 doInBackground 中的 UI。我这里有一些示例代码。

于 2011-04-05T04:28:32.333 回答