2

我注意到在旧设备上,一旦您执行标准共享意图(fb、twitter、电子邮件等),在弹出实际共享对话框之前会有几秒钟的延迟。我想知道在等待此共享对话框出现时如何弹出进度对话框?

这是我的代码:

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

6 回答 6

5

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

  • 创建一个类进度对话框变量。
  • 在我的分享功能开始时显示进度对话框。
  • 在 onPause 我做了以下事情:

if(dialog.isShowing()){
  dialog.dismiss();
}
于 2012-09-27T01:53:58.527 回答
1

我建议以下方法:

  1. 首先创建一个进度对话框并显示它
  2. 通话分享活动
  3. 隐藏返回主活动的进度对话框(onResume)

这是代码:

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();
}
于 2014-10-07T06:20:33.480 回答
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 描述的方法并显示一个 Progress Dialog可能是值得的。

于 2012-09-27T01:45:22.903 回答
0

你可以试试这段代码:

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 {
            // your share method for sharing link or image or anything
                shareTextUrl(link);
            } catch (Exception e) {
            }
            ringProgressDialog.dismiss();
        }
    }).start();
    ringProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
        @Override
        public void onDismiss(DialogInterface dialog) {

        }
    });
}
于 2019-05-31T11:50:06.087 回答
0

显示对话框似乎非常困难,相反,您可以在单击共享按钮时显示“等待应用程序...”之类的 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();
            }
        }
    });
于 2017-08-23T21:42:43.820 回答
-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();

您可以从此处的文档中找到有关 AsyncTask() 的更多信息。

于 2012-09-27T01:41:47.097 回答