Xamarin.Android: ProgressDialog не отображается - PullRequest
0 голосов
/ 24 мая 2018

У меня проблемы с отображением ProgressDialog :

Следующий фрагмент кода показывает мой код в примере:

public override void OnActivityCreated(Bundle savedInstanceState)
{
    base.OnActivityCreated(savedInstanceState);

    progressDialog = new ProgressDialog(Context);
    progressDialog.SetCancelable(false);
    progressDialog.SetMessage("Saving ...");
}


private void Method()
{
    progressDialog.Show();

    var testDialog = progressDialog.IsShowing;

    SaveImage();
}


private void SaveImage()
{
    // does lot 
    ...
    // especially this method takes some time
    mutableBitmap.Compress(Bitmap.CompressFormat.Png, 100, stream);
}

Я создаю ProgressDialog, который яхотите показать перед вызовом метода SaveImage (и отмените его, когда SaveImage сделано).

Моя проблема заключается в том, что ProgressDialog не будет отображаться до тех пор, пока SaveImage Метод выполнен.

В режиме отладки progressDialog.IsShowing равен true , перед SaveImage -Методвызывается, но не отображается.

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Я нашел решение, которое отлично работает для меня:

private async void Method()
{
    progressDialog.Show();

    var thread = new System.Threading.Thread(new ThreadStart(delegate
    {
        SaveImage();
    }));
    thread.Start();

    while(thread.ThreadState == ThreadState.Running)
    {
        await Task.Delay(100);
    }

    progressDialog.Dismiss();
}

Тем временем я передал этот код на аутсорсинг public static class ThreadHelper, который просто выполняет действие (в данном случае SaveImage () ) и ProgressDialog в качестве параметров.

0 голосов
/ 24 мая 2018

Вам придется перенести код, связанный с IO, в фоновый поток, для этого вы можете использовать асинхронную задачу

private class AsyncTaskRunner extends AsyncTask<String, String, String> {

private String resp;
ProgressDialog progressDialog;

@Override
protected String doInBackground(String... params) {
    saveImage();
}


@Override
protected void onPostExecute(String result) {
    // execution of result of Long time consuming operation
    progressDialog.dismiss();
}


@Override
protected void onPreExecute() {
    progressDialog = ProgressDialog.show(getContext(),
            "ProgressDialog",
            "Loading");
}
}
...