결과
데이터베이스2과목에서 Rust로 만드는 웹서버에서 API를 호출하여 스레드리스트를 받아 뿌리는 코드
using Android.App;
using Android.Widget;
using Android.OS;
using System.Collections.Generic;
using System.Threading.Tasks;
using System;
using Org.Apache.Http.Client.Methods;
using Android.Util;
using Java.IO;
using Android.Views;
using Java.Lang;
namespace App1
{
public class DMTask<TParams,TProgress,TResult>
{
public delegate void OnPostExecuteHandler(TResult result);
public delegate TResult Handler(params TParams[] @params);
public event OnPostExecuteHandler OnPostExecute;
public event Action OnPreExecute;
private class _T:AsyncTask<TParams,TProgress,TResult>
{
private Handler m_handler;
private DMTask<TParams, TProgress, TResult> m_dMTask;
public _T(Handler handler, DMTask<TParams, TProgress, TResult> dMTask)
{
m_handler = handler;
m_dMTask = dMTask;
}
protected override void OnPreExecute()
{
if (m_dMTask.OnPreExecute != null)
{
m_dMTask.OnPreExecute();
}
}
protected override void OnPostExecute(TResult result)
{
if(m_dMTask.OnPostExecute != null)
{
m_dMTask.OnPostExecute(result);
}
}
protected override TResult RunInBackground(params TParams[] @params)
{
return this.m_handler(@params);
}
}
public void Run(Handler handler,params TParams[] @params)
{
var a = new _T(handler,this);
a.Execute(@params);
}
}
public class User
{
public string Nickname { get; set; }
public string Email { get; set; }
public int Uid { get; set; }
public static User FromJson(JsonReader reader)
{
var user = new User();
reader.BeginObject();
while (reader.HasNext)
{
switch (reader.NextName())
{
case "uid":
user.Uid = reader.NextInt();
break;
case "email":
user.Email = reader.NextString();
break;
case "nickname":
user.Nickname = reader.NextString();
break;
default:
reader.SkipValue();
break;
}
}
reader.EndObject();
return user;
}
}
public class ThreadSummary
{
public static ThreadSummary FromJson(JsonReader reader)
{
var thread = new ThreadSummary();
reader.BeginObject();
while (reader.HasNext)
{
switch (reader.NextName())
{
case "uid":
thread.Uid = reader.NextInt();
break;
case "subject":
thread.Subject = reader.NextString();
break;
case "opener":
thread.Opener = User.FromJson(reader);
break;
case "recent_update_datetime":
thread.LastUpdate = DateTime.Parse( reader.NextString());
break;
default:
reader.SkipValue();
break;
}
}
reader.EndObject();
return thread;
}
public int Uid { get; set; }
public string Subject { get; set; }
public User Opener { get; set; }
public System.DateTime LastUpdate { get; set; }
}
public class ThreadList
{
public static List<ThreadSummary> Get()
{
var client = System.Net.HttpWebRequest.CreateDefault(new Uri("http://192.168.1.103:9999/threads")) as System.Net.HttpWebRequest;
client.Accept = "application/json";
var response = client.GetResponse() as System.Net.HttpWebResponse;
if(response.StatusCode != System.Net.HttpStatusCode.OK)
{
return null;
}
var res = new List<ThreadSummary>();
var jsonReader = new JsonReader(new InputStreamReader(new System.IO.BufferedStream( response.GetResponseStream())));
jsonReader.BeginArray();
while(jsonReader.HasNext)
{
res.Add(ThreadSummary.FromJson(jsonReader));
}
jsonReader.EndArray();
return res;
}
}
public class ListAdaptor : BaseAdapter<ThreadSummary>
{
private List<ThreadSummary> m_list;
private Activity m_context;
public ListAdaptor(Activity context, List<ThreadSummary> list)
{
m_context = context;
m_list = list;
}
public override int Count => m_list.Count;
public override ThreadSummary this[int position]
{
get
{
return m_list[position];
}
}
public override long GetItemId(int position)
{
return (long)position;
}
public override View GetView(int position, View convertView, ViewGroup parent)
{
View view = convertView;
if(view == null)
{
view = m_context.LayoutInflater.Inflate(Resource.Layout.threadlist_item,null);
}
view.FindViewById<TextView>(Resource.Id.threadlist_item_subject).Text = m_list[position].Subject;
return view;
}
}
[Activity(Label = "App1", MainLauncher = true)]
public class MainActivity : Activity
{
private ListView listView;
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.Main);
listView = FindViewById<ListView>(Resource.Id.listview1);
}
protected override void OnStart()
{
base.OnStart();
var a = new DMTask<object,object, List<ThreadSummary>>();
ProgressDialog progressDialog = new Android.App.ProgressDialog(this);
progressDialog.SetProgressStyle(ProgressDialogStyle.Spinner);
progressDialog.SetMessage("스레드 리스트를 다운받고 있습니다");
progressDialog.Show();
DMTask<object, object, List<ThreadSummary>>.Handler handler = (object[] args)=>
{
return ThreadList.Get();
};
a.OnPostExecute += delegate (List<ThreadSummary> msg)
{
progressDialog.Dismiss();
this.listView.Adapter = new ListAdaptor(this, msg);
//this.textView.Text = msg;
};
a.Run(handler);
}
}
}
좆구린 자마린