0

我在主要活动中使用子类来执行异步任务。我计划之后将它移动到一个单独的文件中,我只是更喜欢这样做以确认它正在工作。HTTPRequest由于等待时间可能很长,我正在尝试使用进度对话框。我什么也没做,doInBackground()因为我读过你不能从那里访问 UI 层。最终发生的事情是我显示我的进度对话框onPreExecute()并在onPostExecute(). 我在上面分别调用每个任务,这可能是我问题的 99%,但我需要能够将我的活动传递给任务,以便它们正常运行。

我已经把很多步骤分解成小块。我得到一个空指针异常,这让我相信我的问题来自不使用 execute() 但我似乎无法弄清楚它是如何工作的。

new CodeRetrievalItem().onPreExecute(MyActivity.this);

new CodeRetrievalItem().onPostExecute(MyActivity.this);

class CodeRetrievalItem extends AsyncTask<Void, Void, Void>{

ProgressDialog dialog;
protected void onPreExecute(Activity actpass){
        dialog = new  ProgressDialog(actpass);
    dialog.setMessage("Loading");
    dialog.setIndeterminate(false); 
    dialog.setCancelable(false);
    dialog.show();

}

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

protected void onPostExecute(Activity actpass){

            // Execute HTTP Request
    try{
        dialog.dismiss();
    }
    catch(Exception e){
        Toast.makeText(actpass, "IOE response " + e.toString(), Toast.LENGTH_LONG).show();
    }

}

}
4

2 回答 2

2

你使用AsyncTask完全错误。您的代码中有几个主要错误。

AsyncTask 受保护的方法

不要自己打电话给他们。在AsyncTask 的文档中,您可以找到:

不要手动调用 onPreExecute()、onPostExecute(Result)、doInBackground(Params...)、onProgressUpdate(Progress...)。

AsyncTask你必须通过调用execute(Params...)方法开始你的。这将导致:

  1. onPreExecute()在后台执行开始之前调用并在主线程上调用
  2. doInBackground(Params...)在后台调用
  3. 后台执行完成后onPostExecute(Result)在主线程上调用。

除非你打电话给execute(Params...)这一切都不会发生。

通用参数

此外,您的通用参数存在问题。AsyncTask具有三个通用参数AsyncTask<Params, Progress, Result>(在您的情况下AsyncTask<Void, Void, Void>,您必须在方法的参数中匹配这些参数。

因此创建:

  1. onPreExecute()代替onPreExecute(Activity actpass)
  2. onPostExecute(Void)代替onPostExecute(Activity actpass)

您定义的那些方法不会以任何方式绑定到异步执行,它们只是类中的一些额外方法。

如果您需要以AsyncTask不同的方式(例如在构造函数中)访问传递中的活动。请注意,将 an 传递Activity给 anAsyncTask可能会导致可能的内存泄漏(在此处使用很好),如果处理不当WeakReference<T>,访问其中的对话框可能会导致崩溃。onPostExecute(Result)

于 2012-12-21T13:20:13.950 回答
1

像这样更改您的代码

new CodeRetrievalItem(MyActivity.this).execute();



class CodeRetrievalItem extends AsyncTask<Void, Void, Void>{
Activity context;
public CodeRetrievalItem(Activity actpass)
{
context=actpass;
}
ProgressDialog dialog;
protected void onPreExecute(Activity actpass){
        dialog = new  ProgressDialog(context);
    dialog.setMessage("Loading");
    dialog.setIndeterminate(false); 
    dialog.setCancelable(false);
    dialog.show();

}

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

protected void onPostExecute(Activity actpass){

            // Execute HTTP Request
    try{
        dialog.dismiss();
    }
    catch(Exception e){
        Toast.makeText(context, "IOE response " + e.toString(), Toast.LENGTH_LONG).show();
    }
于 2012-12-21T12:54:55.617 回答