Android ProgressDialog运行时异常
我在AsyncTask中显示ProgressDialog,如下所示Android ProgressDialog运行时异常,android,multithreading,progressdialog,Android,Multithreading,Progressdialog,我在AsyncTask中显示ProgressDialog,如下所示 public class DataComm extends AsyncTask<String, Void, JSONObject> { ... ProgressDialog pd = null; ... protected void onPreExecute() { pd = ProgressDialog.show(activity, activity.getResources().getText(R.str
public class DataComm extends AsyncTask<String, Void, JSONObject> {
...
ProgressDialog pd = null;
...
protected void onPreExecute() {
pd = ProgressDialog.show(activity, activity.getResources().getText(R.string.wait_please) + "\u2026", "", true);
...
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
...
pd.dismiss();
}
公共类数据通信扩展异步任务{
...
ProgressDialog pd=null;
...
受保护的void onPreExecute(){
pd=ProgressDialog.show(activity,activity.getResources().getText(R.string.wait_please)+“\u2026”,“true”);
...
受保护的void onPostExecute(JSONObject结果){
super.onPostExecute(结果);
...
pd.解散();
}
PD在实现AsyncTask的类中声明。我使用创建的活动的上下文在onPreExecute中初始化它,并尝试在doInbackground的末尾调用PD.disease()。这是从多个活动中调用的,在某些活动中它可以工作,但在其他活动中我得到RuntimeException“向死线程上的处理程序发送消息”。
在失败的情况下,我知道我用来创建PD的活动仍然存在,所以我不知道是什么线程死了
有问题的调用来自一个基类,该基类用于更新从ArrayAdapter派生的类的列表。AsyncTask是在ArrayAdapter需要填充选项列表时调用的。这是否发生在UI主线程以外的某个线程上。我仍然不明白为什么它会在调用onPostExecute之前消亡ed.异步任务doInbackground方法在后台以独立线程(主线程除外)运行。请检查这可能是由于某种原因导致的。我认为您应该首先为AsyncTaskDataComm创建构造函数,然后在构造函数中初始化您的
ProgressDialog
,如下所示:
public class DataComm extends AsyncTask<String, Void, JSONObject> {
...
ProgressDialog pd;
...
public void DataComm(Context mContext)
{
pd = new ProgressDialog(mContext);
}
protected void onPreExecute() {
this.pd.setMessage(mContext.getResources().getText(R.string.wait_please) + "\u2026");
this.pd.show();
...
}
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
...
if (pd.isShowing()) {
pd.dismiss();
}
}
公共类数据通信扩展异步任务{
...
进展性帕金森病;
...
公共无效数据通信(上下文mContext)
{
pd=新建进度对话框(mContext);
}
受保护的void onPreExecute(){
this.pd.setMessage(mContext.getResources().getText(R.string.wait_please)+“\u2026”);
this.pd.show();
...
}
受保护的void onPostExecute(JSONObject结果){
super.onPostExecute(结果);
...
if(pd.isShowing()){
pd.解散();
}
}
试试这个:
public class DataComm extends AsyncTask<String, Void, Void> {
ProgressDialog pd = null;
protected void onPreExecute() {
pd = ProgressDialog.show(activity, activity.getResources().getText(R.string.wait_please) + "\u2026", "", true);
}
protected void onProgressUpdate(Integer... progress) {
pd.setProgress(progress[0]);
}
protected void onPostExecute() {
super.onPostExecute(result);
...
activity.runOnUiThread(new Runnable() {
@Override
public void run(){
if (pd.isShowing()) {
pd.dismiss();
}
}
});
}
}
公共类数据通信扩展异步任务{
ProgressDialog pd=null;
受保护的void onPreExecute(){
pd=ProgressDialog.show(activity,activity.getResources().getText(R.string.wait_please)+“\u2026”,“true”);
}
受保护的void onProgressUpdate(整数…进度){
pd.setProgress(progress[0]);
}
受保护的void onPostExecute(){
super.onPostExecute(结果);
...
activity.runOnUiThread(新的Runnable(){
@凌驾
公开募捐{
if(pd.isShowing()){
pd.解散();
}
}
});
}
}
ArrayAdapter支持似乎是问题所在。从UpdateMap覆盖更新列表似乎是在一个单独的线程上进行的。当我将调用放入runOnUiThread中时,不再有死线程:
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
DataComm dc = new DataComm(itemFetcher, activity, pd);
dc.execute("main", "product_search","search_prefix", newFilter);
}
});
RuntimeException通常意味着另一个异常,请发布您的Logcat@ItzikSamaraRuntimeException的原因是“向死线程上的处理程序发送消息”。在AsyncTask外部创建PD