尝试在异步中捕获HttpClient调用不能按预期工作

时间:2017-04-26 21:13:05

标签: c# android xamarin async-await

我对Android和Xamarin以及C#中的异步任务有点新。我有一个带有启动活动的应用程序,首先检查网络连接,然后通过get请求异步检查我们网站的状态,以确认网站在主要活动开始时将在webview中显示。它检查非200状态代码和一般超时,这在网站完全关闭时发生。

我故意将服务器完全关闭,以便请求超时,以模拟现实生活中的情况。

我将超时值设置为HttpClient实例的属性。我认为,如果有任何超时,它应该执行catch将改变我有的TextView文本。但它永远不会到达那里。应用程序在我规定的确切超时时间后崩溃,所以我想至少我的超时工作正常。 它确实将textview文本更改为“正在检查网站”,因此我知道它至少是在尝试

我无法访问调试器,长话。所以我希望有人可以轻易地看到我遇到的问题或误解。希望提供的代码足够完整,不会有任何不必要的东西,但如果需要,我当然可以提供更多。 THX。

public class Splash : Activity
{
    static readonly string TAG = "X:" + typeof(Splash).Name;
    TextView status = null;
    Button quit = null;
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        Log.Debug(TAG, "SplashActivity");
        SetContentView(Resource.Layout.Main);
        status = FindViewById<TextView>(Resource.Id.status);
        quit = FindViewById<Button>(Resource.Id.quit);
        quit.Click += QuitApp;
    }
    protected override void OnResume()
    {
        base.OnResume();
        CheckConnection(this);
    }
    public void CheckConnection(Context context)
    {
        status.Text = "Checking connections";
        ConnectivityManager cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
        if (cm.ActiveNetworkInfo != null && cm.ActiveNetworkInfo.IsConnected)
        {
            Task t = new Task(CheckWebsite);
            t.Start();
        }
        else
        {
            status.Text = "No Network Connection";
        }
    }
    public async void CheckWebsite()
    {
        status.Text = "Checking Website";
        string page = "http://example.com:6347/";
        HttpClient client = new HttpClient();
        TimeSpan timespan = TimeSpan.FromMilliseconds(5000);
        client.Timeout = timespan;
        try
        {
            HttpResponseMessage response = await client.GetAsync(page);
            if (response.IsSuccessStatusCode)
            {
                status.Text = "Connection OK";
                client.Dispose();
                response.Dispose();
                await Task.Delay(1000);
                StartActivity(new Intent(Application.Context, typeof(MainActivity)));
            }
            else
            {
                status.Text = "Cannot connect to website";
                client.Dispose();
                response.Dispose();
                quit.Visibility = ViewStates.Visible;
                await Task.Delay(2000);
                status.Text = "Connecting to Website";
                Task t = new Task(CheckWebsite);
                t.Start();
            }
        }
        catch(Exception err)
        {
            status.Text = "Connection attempt timed out";
            quit.Visibility = ViewStates.Visible;
            await Task.Delay(2000);
            status.Text = "Connecting to Website";
            Task t = new Task(CheckWebsite);
            t.Start();
        }                
    }
}

0 个答案:

没有答案