【问题标题】:Executing AsyncTask from onClick of AlertDialog doesn't call opPostExecute从 AlertDialog 的 onClick 执行 AsyncTask 不会调用 opPostExecute
【发布时间】:2014-07-24 18:31:50
【问题描述】:

从 AlertDialog 执行 AsyncTask 时出现奇怪的行为。我需要一些建议/解决方法来解决它。我被困在这一点上。

当我从 AlertDialog 执行 AsyncTask 时,它没有调用 onPostExecute。它调用doInBackground,但完成后,它不调用onPostExecute。我希望 AsyncTask 根据 AlertDialog 的按钮按下值来执行。

这里是创建 AlertDialog 并执行 AsyncTask 的函数:

private void processDownloadChoosen(String msg, int __position){
    final AlertDialog.Builder alertBox = new AlertDialog.Builder(new ContextThemeWrapper(ShivaniMP3Activity.this, android.R.style.Theme_Dialog));
    final int position = __position;
    alertBox.setMessage(msg);
    alertBox.setCancelable(false)
            .setPositiveButton("Download", new DialogInterface.OnClickListener(){
                    public void onClick(DialogInterface dialog,int id){
                        dialog.dismiss();
                        String downloadURL = entries.get(position);
                        AsyncTaskDownload atd = new AsyncTaskDownload(downloadURL);
                        if((downloadURL != null) &&(downloadURL != "")){
                            EnglishMP3Activity.totalDownloads++;
                            if(downloadWindow == null){
                                downloadWindow = new PopupWindow(downloadPopupLayout, LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT, true);
                                downloadWindow.showAtLocation(downloadPopupLayout, Gravity.CENTER, 0, 0);
                            }
                            atd.execute();
                        }
                    }
            }).setNegativeButton("Listen", new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog,int id){
                    dialog.dismiss();
                    String downloadURL = entries.get(position).replace("%20", " ");
                    emp = new EasyMediaPlayer(mp3PopupLayout,buttonPlayPause,seekBarProgress,tv_mp3,downloadURL);
                    emp.startPlayingMP3();          
                }
        }).show();
}

我从列表视图的项目点击中调用此函数:

//lv is listview 
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        public void onItemClick(AdapterView<?> p, View v, int position, long id) {
            processDownloadChoosen("Do you want to Listen or Download this file ?",position);
        }
    });

我的 AsyncTask 定义如下:

public class AsyncTaskDownload extends AsyncTask<Void, String, Void> {
    //
    protected void onPreExecute(){
        pBar1.setVisibility(View.INVISIBLE);
        //
    }

    protected Void doInBackground(Void... vd){
        try{
            //do something
        }
        catch(Exception e){
            //do somting
        }
        return null;
    }

    protected void onProgressUpdate(String... msg) {
        //do smething
    }

    protected void onPostExecute(Void in){
        cancelDownloadButton.setVisibility(View.GONE);
        //do smtthing
    }
}

请注意:当我直接从 ListView 的项目点击功能执行 AsyncTask 时,一切正常。但是从 AlertDialog 调用时,它不会调用 onPostExecute。

感谢任何帮助解决/解决此问题..提前感谢

【问题讨论】:

    标签: android android-asynctask android-alertdialog


    【解决方案1】:

    尝试使用处理程序/Runnable,以便在 alertDialog 的 onPositiveClick 回调中执行

    Handler mHandler;
    prtected void onCreate(Bundle sis) {
        //other code
        this.mHandler = new Handler();
    }
    
    //In your DialogInterface.OnClickListener
    
    mHandler.post(new Runnable() { 
        @Override 
        public void run() {
            //Init and launch your asynctask here
        }
    });
    

    这不起作用的原因是必须在 UI 线程上调用 AsyncTask,并且我很确定在肯定按钮回调上的调用没有直接与活动上下文链接(假设任务从 ListView 的 onItemClick 回调中工作) )

    【讨论】:

    • 没有兄弟。仍然没有调用: mHandler.post(new Runnable() { public void run() { String downloadURL = entries.get(position); AsyncTaskDownload atd = new AsyncTaskDownload(downloadURL); if((downloadURL != null) &&(downloadURL != "")){ EnglishMP3Activity.totalDownloads++; if(downloadWindow == null){ downloadWindow = new PopupWindow(downloadPopupLayout, LayoutParams.MATCH_PARENT,LayoutParams.WRAP_CONTENT, true); downloadWindow.showAtLocation(downloadPopupLayout, Gravity.CENTER, 0, 0 ); } atd.execute(); } }
    【解决方案2】:

    浏览了几篇帖子后,AlertDialog 中的 AsyncTask 似乎无法正常工作。 所以我通过“愚弄”Android来实现这一点。不,我在 doInBackground 函数中做所有事情,并且感觉好像 preexecute/postexecute 被调用了。 以下是我所做的:

    1) 从 AsyncTask 中删除了 onPreExecute() 和 onProgressUpdate()。 2) 定义 doInBackground 类似:

    protected Void doInBackground(Void... vd){
    publishProgress("I_AM_STARTED");
    //Other Work
    publishProgress("I_AM_DONE");
    }
    

    3) 定义 onProgressUpdate 类似:

    protected void onProgressUpdate(String... msg) {
    if(msg[0].equals("I_AM_STARTED")){
    //code for onPreExecute
    }
    else if(msg[0].equals("I_AM_DONE")){
    //code for onPostExecute
    }
    else{
    //normal code
    }
    }
    

    希望这可能对像我这样被卡住的人有所帮助。 :-)

    【讨论】:

      猜你喜欢
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多