نوشتن متد ساده با AsyncTask
سلام. من میخوام این متد ساده رو با AsyncTask بنویسم. ولی چون که خروجی این متد از نوع آرایه هست، گیج شدم که چجوری اونو توی Async بنویسم. به نظرتون چجوری میشه اینو تبدیل کنم به Async؟
public static List<Information> getDataRecycler() { Thread getThread = new Thread(new Runnable() { @Override public void run() { try { //Read URL For Receive Json Code String result = Webservice.readUrl(url); Log.i("LOG", "URLRESULT: "+ result); if (result != null) { try { G.recyclerList.clear(); JSONArray jsonurl = new JSONArray(result); for (int i = 0; i < jsonurl.length(); i++) { JSONObject object = jsonurl.getJSONObject(i); Information url = new Information(); url.p_uname = object.getString("p_uname"); url.p_desc = object.getString("p_desc"); url.p_uid = object.getInt("p_uid"); G.recyclerList.add(url); } } catch (JSONException e) { e.printStackTrace(); } } } catch (Exception e) { e.printStackTrace(); } } }); getThread.start(); return G.recyclerList; }
اگر با چند تا نمونه دیگه مقایسه کنید متوجه میشید چی به چیه :)
public class GetData extends AsyncTask<String, Void, List<Information>> {
@Override
protected List<Information> doInBackground(String... params) {
// read data using web service
// url is : params[0]
List<Information> list = new ArrayList<>();
// add data to list
return list;
}
@Override
protected void onPostExecute(List<Information> result) {
super.onPostExecute(result);
// do what ever you want with "result"
}
}
نحوه استفاده:
توی این روش نتیجه رو هر جور نیاز هست توی متد onPostExecute استفاده کنید و تنها Async رو اجرا میکنیم.
new GetData().execute("write url here");
توی این روش با متد onPostExecute کاری نداریم و میتونید پاک کنید، این جوری درست شبیه متد عمل میکنه، ولی روش اول به نظرم بهتر هست.
List<Information> list = new GetData().execute("write url here").get();
اینجا رو هم بخونید بد نیست.
ببین Spirit جان، من توی متدم ورودی ندارم که بخوام اینجا ورودی براش بذارم
این قسمت فراخوانی متدمه:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); AdapterRecyclerView adapter = new AdapterRecyclerView(getApplicationContext(), getDataRecycler()); recyclerView.setAdapter(adapter);
میخوام اون متدی که بالا نوشتم توی doInBackground اجرا شه و این قسمت پایینی که فراخوانیش هست، توی onPostExecute اجرا شه
اگر recycleView رو بصورت فیلد تعریف کنی و کلاس Async رو به صورت inner class یعنی داخل کلاس اکتیویتی بنویسی، متد onPostExecute اینجوری نوشته میشه (حالا ورودی هم نیاز نداره) :
public class GetData extends AsyncTask<Void, Void, List<Information>> {
@Override
protected List<Information> doInBackground(Void... params) {
// read data using web service
List<Information> list = new ArrayList<>();
// add data to list
return list;
}
@Override
protected void onPostExecute(List<Information> result) {
super.onPostExecute(result);
// do what ever you want with "result"
recyclerView.setAdapter(new AdapterRecyclerView(getApplicationContext(), result));
}
}
اجرا:
recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
new GetData().execute();
راه های دیگر و شاید بهتر و بقول دوستان Dynamic تر هم وجود داره که مستلزم تسلط نسبتاً خوب به مبحث شی گرایی داره.
من کد رو اینجوری نوشتم. حالا نمیدونم چرا کرش میکنه و کلا اجرا نمیشه. البته کرشش هم این پایینه
public class receiveRecycler extends AsyncTask<Void, Void, List<Information>> { @Override protected List<Information> doInBackground(Void... params) { //Read URL For Receive Json Code String result = Webservice.readUrl(url); Log.i("LOG", "URLRESULT: "+ result); if (result != null) { try { G.recyclerList.clear(); JSONArray jsonurl = new JSONArray(result); for (int i = 0; i < jsonurl.length(); i++) { JSONObject object = jsonurl.getJSONObject(i); Information url = new Information(); url.p_uname = object.getString("p_uname"); url.p_desc = object.getString("p_desc"); url.p_uid = object.getInt("p_uid"); G.recyclerList.add(url); } } catch (JSONException e) { e.printStackTrace(); } } return G.recyclerList; } @Override protected void onPostExecute(List<Information> result) { super.onPostExecute(result); //tarif va meghdar dehie RecyclerView AdapterRecyclerView adapter = new AdapterRecyclerView(getApplicationContext(), result); recyclerView.setAdapter(adapter); recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this, LinearLayoutManager.HORIZONTAL, false)); //end dialog4.dismiss(); } }
پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .