0

我制作了一个应用程序,它以指定的时间间隔向网络服务器发送请求并获取 XML 数据。然后它解析 XML 数据,从电话中获取信息(短信、联系人或类似的东西),并通过 http post 请求将其发送回服务器。

问题是应用程序通常需要几秒钟才能获取信息,这通常会使应用程序崩溃。出现一个对话框,说应用程序已无响应,并询问我是否要关闭应用程序或等待,如果我按下等待它最终会再次开始工作。

AsyncTask 是解决这个问题的正确方法吗?

我不太了解的另一件事是 AsyncTask 的实际工作原理。假设我有两种方法可以做很多工作并使应用程序崩溃,我可以将它们都放在一个 AsyncTask 中并从 doInBackground() 中调用它们吗?

4

3 回答 3

1

我也实现了你正在尝试的类似的东西。即向服务器发送请求,接收 XML 响应,解析 XML,显示结果。查看这个。我为此使用了 AsyncTask。

这是我使用 AsynTask 实现它的方式

private class AsyncClass extends AsyncTask<Void, Void, Bundle>{
    @Override
protected Bundle doInBackground(Void... arg0) {
    Bundle b=startProcess();        

// startBundle() method do all the processing and return result in a bundle. You can as many methods from within startBundle() method

    return b;
}       

@Override
protected void onPostExecute(Bundle result) {
    Log.d(TAG , "In onPostExecute");
    dialog.dismiss();
    if(result==null)
        Toast.makeText(cont, "Can't process query.\nTry again later.", Toast.LENGTH_LONG).show();
    else{
        Intent in = new Intent(cont, QueryResultDisplay.class);
        Log.d(TAG , "Displaying");
        in.putExtras(result);        
        cont.startActivity(in);           
    }
}
于 2012-05-18T12:16:08.583 回答
1

我给你简要描述一下你的问题。

有很多可能您没有从服务器获取数据

  1. 如果您的网络速度很慢,并且您尝试从服务器和 XML 数据中获取所有信息,那么在这种情况下,如果网络崩溃,则会显示错误

  2. 如果您向不在服务器中的页面发出请求

现在,如果您在代码中遇到问题,那么我会为您提供我在项目中实现的 AsyncTask 类的完整代码,它工作正常。

private class GetLoginResponse extends AsyncTask<Void, Void, Boolean> {
    private ProgressDialog progressDialog;
    private String email;
    private String password;

    public GetLoginResponse(String emailId, String paswd) {
        this.email = emailId;
        this.password = paswd;
    }

    @Override
    protected void onPreExecute() {
        progressDialog = ProgressDialog.show(LoginActivity.this, "",
                "Loading....", true, false);
    }

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

        try {
            DefaultHttpClient httpclient = new DefaultHttpClient();
            HttpGet httpGet = new HttpGet(url);
                            HttpResponse response = httpclient.execute(httpGet);
        //here u can check the reponse is ok and 200 
                         } catch (NetworkException e) {
            isNetworkError = true;
        }
        return false;
    }

    @Override
    protected void onPostExecute(Boolean data) {
        progressDialog.dismiss();
        System.out.println("lOGIN RESPONSE for email = " + email + data);
    }
}// end AsyncTask

这将解决您的问题。

于 2012-05-18T12:33:50.883 回答
0

是的,您可以使用 AsyncTask。

在 doInBackground() 中调用的代码不得接触 UI。

您可以使用 publishProgress() 触摸 UI 线程。

于 2012-05-18T12:08:04.883 回答