我对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();
}
}
}