如何在等待分享意图弹出时显示进度对话框

时间:2012-09-27 01:36:19

标签: android

我注意到在较旧的设备上,一旦你执行了标准的共享意图(fb,推特,电子邮件等),在弹出实际的共享对话框之前会有几秒钟的延迟。我想知道在等待显示这个共享对话框时如何弹出进度对话框?

这是我的代码:

 private void share(String subject,String body) {
        Intent share = new Intent(Intent.ACTION_SEND);
        share.setType("text/plain");
        share.putExtra(android.content.Intent.EXTRA_SUBJECT, title);
        share.putExtra(android.content.Intent.EXTRA_TEXT, body);
        startActivity(Intent.createChooser(share, "Share via"));
    }

6 个答案:

答案 0 :(得分:5)

我想出了怎么做。当您调用startActivity(shareIntent)时,将调用方法中的onPause。所以为了解决这个问题,我做了以下几点:

  • 创建一个类进度对话框变量。
  • 在我的共享功能开始时显示进度对话框。
  • 在onPause中,我执行了以下操作:

if(dialog.isShowing()){
  dialog.dismiss();
}

答案 1 :(得分:1)

这似乎不可能 - 您无法知道Intent Chooser何时准备好显示。就您的应用而言,这似乎是一种异步操作。

要确认这一点,您可以尝试计时功能:

private void share(String subject,String body) {
    //Timing code
    long startTime = System.currentTimeMillis();

    Intent share = new Intent(Intent.ACTION_SEND);
    share.setType("text/plain");
    share.putExtra(android.content.Intent.EXTRA_SUBJECT, title);
    share.putExtra(android.content.Intent.EXTRA_TEXT, body);
    startActivity(Intent.createChooser(share, "Share via"));

    //Timing code
    long endTime = System.currentTimeMillis();
    Log.d("Test", "Time for share function: " + (endTime-startTime) + "ms");
}

如果得到一个非常小的结果,这意味着你的功能正在快速执行,瓶颈在于Android系统本身(你不能影响)。

另一方面,如果你得到大约500+毫秒的东西,可能值得使用XepterX和display a Progress Dialog描述的方法。

答案 2 :(得分:1)

我建议采用以下方法:

  1. 首先创建一个进度对话框并显示它
  2. 致电分享活动
  3. 隐藏进度对话框,返回主活动(onResume)
  4. 以下是代码:

    ProgressDialog shareWaitDialog;
    
    private void shareIt() {
        String subject="Subject";
        String text  = "text....";
        shareWaitDialog = new ProgressDialog(getActivity());
        shareWaitDialog.setTitle("Sharing...");
        shareWaitDialog.setMessage(subject);
        shareWaitDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
        shareWaitDialog.show();
    
        Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND);
        sharingIntent.setType("text/plain");
        sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT,
                subject);
        sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT,
                text));
        startActivity(Intent.createChooser(sharingIntent,
                "Share using:"));
    }
    
    @Override
    public void onResume() {
        if (shareWaitDialog != null && shareWaitDialog.isShowing())
            shareWaitDialog.hide();
    
        super.onResume();
    }
    

答案 3 :(得分:0)

显示对话框似乎非常困难,相反,您可以在共享按钮上显示“等待应用...”等Toast。 Toast可以填补时间空间。

mShare.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {


            Toast.makeText(ReferralActivity.this, "Waiting for Apps to Send", Toast.LENGTH_SHORT).show();

            try {
                String sAux = "Content To Share";
                Intent i = new Intent(Intent.ACTION_SEND);
                i.setType("text/plain");
                i.putExtra(Intent.EXTRA_SUBJECT, "Sample");
                i.putExtra(Intent.EXTRA_TEXT,sAux);
                startActivity(Intent.createChooser(i, "Share using:"));
            } catch(Exception e) {
                //e.toString();
            }
        }
    });

答案 4 :(得分:0)

You Can try this code:

void share(String link) {
    final ProgressDialog ringProgressDialog = ProgressDialog.show(this, "", getString(R.string.please_wait), true);
    ringProgressDialog.setCancelable(false);
    new Thread(new Runnable() {
        public void run() {
            try {

                shareTextUrl(link);
            } catch (Exception e) {
            }
            ringProgressDialog.dismiss();
        }
    }).start();
    ringProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {

        }
    });
}

答案 5 :(得分:-1)

您可以使用AsyncTask()来帮助您显示对话框进度,例如

 private class TestTask extends AsyncTask<Void, Void, Void> {

    protected void onPreExecute() { 
        //show dialog 
    }

    protected void doInBackground(Object... params) { 
        private void share(subject,body); 
    }

    protected void onPostExecute(Long result) {
        //cancel dialog
    }
}

并按

开始任务
new TestTask().execute();

您可以从the documentation here找到有关AsyncTask()的更多信息。