0

AlertDialog から AsyncTask を実行すると、奇妙な動作が発生します。それを修正するには、いくつかの提案/回避策が必要です。私はこの時点で立ち往生しています。

AlertDialog から AsyncTask を実行すると、onPostExecute が呼び出されません。doInBackground を呼び出しますが、終了後に onPostExecute を呼び出しません。AlertDialog のボタン押下値に基づいて AsyncTask を実行したい。

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 を呼び出しません。

これを解決/回避するための助けをいただければ幸いです.. 事前の感謝

4

2 に答える 2

0

alertDialog の onPositiveClick コールバックで行うように、ハンドラ/Runnable を使用してみてください

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

これが機能しない理由は、AsyncTask を UI スレッドで呼び出す必要があり、ポジティブ ボタン コールバックでの呼び出しがアクティビティ コンテキストに直接リンクされていないことを確信しているためです (タスクが ListView の onItemClick コールバックから機能する場合)。

于 2013-07-27T05:44:13.230 に答える