【问题标题】:how to show dialog while doInBackground(). Asynctask如何在 doInBackground() 时显示对话框。异步任务
【发布时间】:2015-09-21 11:46:10
【问题描述】:

我正在尝试在 android 中使用 Asynctask 执行任务。

class GetItemNames extends AsyncTask<CosmeConnection, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(CosmeConnection... cosme) {
        ContentValues cv;
        cosme[0].orderListOfNames();
        while(!(cosme[0].getState() == CosmeStates.RECEIVED_LIST_OF_NAMES)){}
        DBHandler dbHandler = new DBHandler(getApplicationContext());
        SQLiteDatabase db = dbHandler.getReadableDatabase();
        if(db != null){
            db.delete(DBHandler.TABLE_SERVER_ITEM, null, null);

            String[] nombres = cosme[0].getExistingNames().getListOfNames().toString().replaceAll("[\\[\\]]", "").split(",");
            for (String str : nombres){
                cv = new ContentValues();
                cv.put(DBHandler.SERVER_ITEM_NAME, str);
                cv.put(DBHandler.SERVER_ITEM_NAME, "N");
                try{
                    db.insert(DBHandler.TABLE_SERVER_ITEM, null, cv);
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
        db.close();
        dbHandler.close();
        return null;
    }

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

    }

    @Override
    protected void onPostExecute(String result) {

    }
}

我正在像这样启动这个 asyncktask:

new GetItemNames().execute(cosme, null, null);  

我想在 doInBackGround() 运行时显示一个对话框,其中包含“从服务器获取名称列表”消息。我试图这样做:

protected void onProgressUpdate(String... progress) {
        String title = getString(R.string.received_list_of_names_title);
        String msg = getString(R.string.received_list_of_names_msg);
        DialogHelper.getAlertDialog(getApplicationContext(), title, msg);
}

DialogHelper 只是一个管理对话框的类,getAlertDialog() mehots 显示一个带有标题和消息的普通警报对话框。

但这也不起作用,我不知道如何显示一个自动打开并在“doInBackGround()”完成时关闭的对话框。

我该怎么做?

非常感谢!

编辑:尝试建议后我有这个例外:

09-21 14:07:21.966: E/AndroidRuntime(22016): FATAL EXCEPTION: main
09-21 14:07:21.966: E/AndroidRuntime(22016): Process: tfc.unizar.blasmobile, PID: 22016
09-21 14:07:21.966: E/AndroidRuntime(22016): android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.view.ViewRootImpl.setView(ViewRootImpl.java:643)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:261)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:69)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.app.Dialog.show(Dialog.java:286)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at tfc.unizar.blasmobile.BagContent$GetItemNames.onPreExecute(BagContent.java:263)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.os.AsyncTask.execute(AsyncTask.java:535)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at tfc.unizar.blasmobile.BagContent.onOptionsItemSelected(BagContent.java:133)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.app.Activity.onMenuItemSelected(Activity.java:2633)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:1040)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at com.android.internal.view.menu.MenuPopupHelper.onItemClick(MenuPopupHelper.java:184)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.widget.AdapterView.performItemClick(AdapterView.java:299)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.widget.AbsListView.performItemClick(AbsListView.java:1152)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:3014)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.widget.AbsListView$3.run(AbsListView.java:3865)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.os.Handler.handleCallback(Handler.java:808)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.os.Handler.dispatchMessage(Handler.java:103)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.os.Looper.loop(Looper.java:193)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at android.app.ActivityThread.main(ActivityThread.java:5296)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at java.lang.reflect.Method.invokeNative(Native Method)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at java.lang.reflect.Method.invoke(Method.java:515)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
09-21 14:07:21.966: E/AndroidRuntime(22016):    at dalvik.system.NativeStart.main(Native Method)

在此之后应用程序被强制关闭。有什么建议吗?

【问题讨论】:

标签: android android-asynctask android-alertdialog progressdialog async-onprogressupdate


【解决方案1】:
private ProgressDialog mProgress;
@Override
protected void onPreExecute(){ 
   super.onPreExecute();
   mProgress = new ProgressDialog(yourContext);
   mProgress.setMessage("Obtaining list of names from server...");
   mProgress.show();    
}

@Override
protected void onPostExecute(String result){
   super.onPostExecute(result);
   mProgress.dismiss();
}

【讨论】:

  • 那是别人回答的……因为这个问题是重复的……你为什么一次又一次地回答重复的问题?
  • 感谢您的回答,但无法正常工作。我收到一个例外,在编辑后添加到问题中。
  • 我已经解决了这个问题,getBaseContext() 不是一个很好的对话上下文,由 ClassName.this 更改并正常工作。非常感谢 Bhuvi!
【解决方案2】:

将此代码添加到您的 Asynctask 中。

初始化progressDialoge

ProgressDialog progressDialog;

并添加此代码在onPreExecute中添加

 progressDialog = ProgressDialog.show(Form.this, "", "Loading...", true,false);

最后onPostExecute添加此代码

   if(progressDialog1!=null && progressDialog1.isShowing()){
            progressDialog1.dismiss();
            Log.e("DISMISS", "DISMISS");
        }

【讨论】:

    【解决方案3】:

    就这样吧..

    private ProgressDialog mDialog;
    
    @Override
    protected void onPreExecute(){    
       mDialog = new ProgressDialog(context);
       mDialog.setMessage("loading...");
       mDialog.setIndeterminate(true);
       mDialog.setCancelable(false);
       mDialog.show();    
    }
    
    @Override
    protected void onPostExecute(String result){
       mDialog.dismiss();
    }
    

    【讨论】:

      【解决方案4】:

      您无法在doInBackground 中显示对话框,因为doInBackground 不会保留在主线程中(您无法获取显示它的上下文)。但是onPreExecuteonPostExecute 方法属于主线程,您可以在该方法中调用getAplicationContext()。我建议在该方法中显示对话框。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-29
        相关资源
        最近更新 更多