-1

我已经从下面的链接中实现了代码来检查应用程序的空闲时间 如何打算在 android 上的另一个页面/从空闲时间弹出消息?

而是使用线程我使用了异步任务......现在我的问题一旦达到空闲时间......我想向用户应用程序显示对话框是从登录活动结束重新登录......我如何从异步任务 onpostExcute 调用对话框

public class session extends AsyncTask<Void,Void,Void> {
private static final String TAG=session.class.getName();
private long lastUsed;
private long period;
private boolean stop;
Context context;


final Dialog dialog = new Dialog(context);
@Override
protected Void doInBackground(Void... params) {
    // TODO Auto-generated method stub
    //here i do the process.......
}
@Override
protected void onPostExecute(Void x){
        //stuff to be done after task executes(done on UI thread)

    // For Dialog Button**********************************
    dialog.setContentView(R.layout.dialog);

    dialog.setTitle("Result");

    final TextView dialogtxt = (TextView) dialog
            .findViewById(R.id.textView1);

    final Button closeButton = (Button) dialog
            .findViewById(R.id.button1);

    closeButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            dialog.dismiss();
        }
    });

    dialogtxt.setText("session time out");
    dialog.show();

    // ****************************************************

}
@Override
protected void onPreExecute(){
        //stuff to be done after task executes(done on UI thread)

}

}
4

2 回答 2

0

您可以通过从除 doInBackground 方法之外的任一方法调用对话框来完成此操作。

您可以在 onPreExecute 中调用它并在那里显示对话框,在您的后台任务完成后,您可以从 onPostExecite 方法中取消它。如果您想要更多控制权,也可以使用 onProgressUpdate 来实现。只需通过调用 publishProgress 并覆盖 onProgressUpdate 方法并在那里做任何你想做的事情来调度你的后台任务的进度。

这是直接从文档中取出的示例。

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count; i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return totalSize;
     }

     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }

     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
 } 
于 2012-07-31T09:45:57.370 回答
-1

Asynctask 需要获取 Context。如果您的 Asynctask 嵌入到活动中,只需调用 java Activity.this 作为上下文。您还可以将上下文作为字段放在 Asynctask 中,然后将其作为 arg 提供给 Asynctask。

您可以在 onPostExecute 中调用 Dialog.show,它位于 UI 线程上。

此示例 AsyncTask 嵌入到活动中

公共类 AsyncDialogBu​​ilder 扩展 AsyncTask {

    private Context context = DriverOnTripActivity.this;
    private final AlertDialog.Builder dialog = new AlertDialog.Builder(context);
    private Integer remoteAllWaitinOnCount;

    public Context getContext() {
        return context;
    }

    public void setContext(Context context) {
        this.context = context;
    }

    @Override
    protected void onPreExecute() {
    }

    @Override
    protected Integer doInBackground(Integer... integers) {
        remoteAllWaitinOnCount = User.getRemoteAllWaitinOnCount(latestClosestKojo.getRemoteId());
        if (remoteAllWaitinOnCount > 0) {
            try {
                makeDialog();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return 100;
        } else {
            return 99;
        }
    }

    private void makeDialog() {
        dialog.setTitle(latestClosestKojo.getName()
                + " - "
                + remoteAllWaitinOnCount
                + " Kojoalas");
        dialog.setPositiveButton("S'arreter", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                isDialogPrompted = false;
                dialogInterface.dismiss();
                goToOnBoardingActivity();
            }
        });
        dialog.setNegativeButton("Ignorer", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                isDialogPrompted = false;
                dialogInterface.dismiss();
            }
        });
    }

    @Override
    protected void onPostExecute(Integer integers) {
        if (integers >= 100 && dialog != null) {
            dialog.show();
            isDialogPrompted = true;
        }
    }
}
于 2012-07-31T09:37:49.723 回答