2012-12-21 49 views
0

我正在使用我的主要活动内的子类来执行asynctask。我打算在事后把它移入一个单独的文件,我只是喜欢这样做,以确认它正在工作。由于等待时间可能很长,我正在尝试执行带进度对话框的HTTPRequest。我在doInBackground()中没有做任何事情,因为我读过你不能从那里访问UI层。最终发生的是我在onPreExecute()上显示我的进度对话框,并在onPostExecute()中将其解除。我在上面单独地调用每个任务,这可能是我的问题的99%,但我需要能够将我的活动传递给任务以使它们正常工作。解散asynctask中的进度对话框时,Android应用程序强制关闭

我已经把很多步骤分解成小块。我得到一个空指针异常,导致我相信我的问题来自不使用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(); 
    } 

} 

} 
+2

Post logcat ... –

+0

您是否在拨打电话后尝试拨打另一个活动 –

+0

您必须在** doInBackground **中执行HTTP请求**而不是在** onPostExecute ** – Umesh

回答

2

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

的AsyncTask保护方法

不要自己给他们打电话。在documentation for AsyncTask,你可以找到:

不要手动调用onPreExecute(),onPostExecute(结果),doInBackground(参数...),onProgressUpdate(进展...)。

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

  1. onPreExecute()之前后台执行的开始被调用,被称为主线程
  2. doInBackground(Params...)上称为后台后台执行完毕onPostExecute(Result)
  3. 后称为主线。

除非您致电execute(Params...)否则不会发生这种情况。

通用参数

而且可能是您的通用参数有问题。 AsyncTask有三个通用参数AsyncTask<Params, Progress, Result>(在您的案例​​中,您必须在方法参数中匹配这些参数。

因此创建:

  1. onPreExecute()而不是onPreExecute(Activity actpass)
  2. onPostExecute(Void)而不是onPostExecute(Activity actpass)

您定义没有义务以任何方式异步执行这些方法,他们只是一些班上额外的方法。

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

+0

感谢此帮助我弄清楚我做错了什么。之前从来没有与此混淆过,所以你帮忙清理了一下。现在一切都很好,我正在使用它来实现更多功能! – TheHamstring

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(); 
    }