بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]
پرسش و پاسخ

نوشتن متد ساده با AsyncTask

مدیریت گفتگو
احسان منصوری 11 سال پیش
آخرین تغییر: 11 سال پیش

سلام. من میخوام این متد ساده رو با 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;

    }

نظرات

CodeMaster 11 سال پیش
از Interface استفاده کنید. آموزشش توی ماژول وبسرویس هست
احسان منصوری 11 سال پیش
من توی قسمتای دیگه ی برنامه م از Async استفاده کردم. ولی اونجا خروجی نداشتن متدهام. اما اینجا متدم یه خروجی List داره. اینو چجوری بنویسم؟
CodeMaster 11 سال پیش
همونجوری که گفتم از interface استفاده کنید که توی آموزش وبسرویس ماژول توسط استاد آموزش داده شده

پاسخ‌ها 4

Spirit 11 سال پیش

اگر با چند تا نمونه دیگه مقایسه کنید متوجه میشید چی به چیه :)

 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();

اینجا رو هم بخونید بد نیست.

نظرات

احسان منصوری 11 سال پیش

ببین Spirit جان، من توی متدم ورودی ندارم که بخوام اینجا ورودی براش بذارم

این قسمت فراخوانی متدمه:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
AdapterRecyclerView adapter = new AdapterRecyclerView(getApplicationContext(), getDataRecycler());
recyclerView.setAdapter(adapter);

میخوام اون متدی که بالا نوشتم توی doInBackground اجرا شه و این قسمت پایینی که فراخوانیش هست، توی onPostExecute اجرا شه

 

نظرات

Spirit 11 سال پیش

اگر 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 تر هم وجود داره که مستلزم تسلط نسبتاً خوب به مبحث شی گرایی داره.

نظرات

احسان منصوری 11 سال پیش

من کد رو اینجوری نوشتم. حالا نمیدونم چرا کرش میکنه و کلا اجرا نمیشه. البته کرشش هم این پایینه

 

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

    }


نظرات

Spirit 11 سال پیش
خطای null هست ولی علتش فکر کنم پایین تر هست که تو عکس نیست، احتمال میدم بخاطر recycleView هست.

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .