2

私は現在、モバイル Android アプリケーションに向けて取り組んでいます。このアプリでロード時間の問題が発生する主な原因は、Web サービスの json 文字列です。現在の段階では、ロードに時間がかかりすぎて、アプリが強制的に閉じられる (長時間停止する) 場合があります。

Splash -> MainActivity -> HomeActivity これがアプリケーションの開始方法です。

最初に Splash を表示し、その背後で次のコードで構成される MainActivity を実行します。

public class HomeActivity : Activity
{

    NewsObject[] news;

    protected override void OnCreate (Bundle bundle)

    {

        base.OnCreate (bundle);



        SetContentView (Resource.Layout.Main);



        var request = HttpWebRequest.Create(string.Format(@"http://rapstation.com/webservice.php"));

        request.ContentType = "application/json";

        request.Method = "GET";



        using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)

        {

            if (response.StatusCode != HttpStatusCode.OK)

                Console.Out.WriteLine("Error fetching data. Server returned status code: {0}", response.StatusCode);

            using (StreamReader reader = new StreamReader(response.GetResponseStream()))

            {

                var content = reader.ReadToEnd();

                if(string.IsNullOrWhiteSpace(content)) {

                    Console.Out.WriteLine("Response contained empty body...");

                    Toast toast = Toast.MakeText (this, "No Connection to server, Application will now close", ToastLength.Short);

                    toast.Show ();

                }

                else {

                    news = JsonConvert.DeserializeObject<NewsObject[]>(content);

                }

            }

            Console.Out.WriteLine ("Now: \r\n {0}", news[0].title);

        }



        var list = FindViewById<ListView> (Resource.Id.list);

        list.Adapter = new HomeScreenAdapter (this, news);

        list.ItemClick += OnListItemClick;



        var Listen = FindViewById<Button> (Resource.Id.btnListen);

        var Shows  = FindViewById<Button> (Resource.Id.btnShows);



        Listen.Click += (sender, e) => {

            var second = new Intent (this, typeof(RadioActivity));

            StartActivity (second);

        };



        Shows.Click += (sender, e) => {

            var second = new Intent (this, typeof(ShowsActivity));

            StartActivity (second);

        };

    }



    protected void OnListItemClick(object sender, AdapterView.ItemClickEventArgs e)

    {

        var listView = sender as ListView;

        var t = news[e.Position];

        var second = new Intent (this, typeof(NewsActivity));

        second.PutExtra ("newsTitle", t.title);

        second.PutExtra ("newsBody", t.body);

        second.PutExtra ("newsImage", t.image);

        second.PutExtra ("newsCaption", t.caption);

        StartActivity (second);



        Console.WriteLine("Clicked on " + t.title);

    }

}

私が直面している問題は、アプリがスプラッシュ ページに固執し、アプリケーションの出力から、メイン スレッドで実行しすぎていることがわかります。

バックグラウンドで動作するようにダウンロード要求を分離する方法は何ですか?

4

3 に答える 3

3

はい、AsyncTaskを使用する必要があります。これも役立つはずです。

于 2013-07-17T20:18:03.497 に答える
0

使用している .Net/Mono バージョンがasync/awaitをサポートしている場合は、簡単に実行できます

async void DisplayNews()
{
    string url = "http://rapstation.com/webservice.php";

    HttpClient client = new HttpClient();
    string content = await client.GetStringAsync(url);
    NewsObject[] news = JsonConvert.DeserializeObject<NewsObject[]>(content);
    //!! Your code to add news to some control
}

そうでない場合は、Taskを使用できます

void DisplayNews2()
{
    string url = "http://rapstation.com/webservice.php";

    Task.Factory.StartNew(() =>
        {
            using (var client = new WebClient())
            {
                string content = client.DownloadString(url);
                return JsonConvert.DeserializeObject<NewsObject[]>(content);
            }
        })
    .ContinueWith((task,y) =>
        {
            NewsObject[] news = task.Result;
            //!! Your code to add news to some control
        },null,TaskScheduler.FromCurrentSynchronizationContext());
}
于 2013-07-18T09:13:22.673 に答える