آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
مشکل عدم دسترسی خریداران پیشین به برخی آموزش ها برطرف شد
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

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

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

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

    }
0 0
از Interface استفاده کنید. آموزشش توی ماژول وبسرویس هست (9 سال پیش)
0 0
من توی قسمتای دیگه ی برنامه م از Async استفاده کردم. ولی اونجا خروجی نداشتن متدهام. اما اینجا متدم یه خروجی List داره. اینو چجوری بنویسم؟ (9 سال پیش)
0 0
همونجوری که گفتم از interface استفاده کنید که توی آموزش وبسرویس ماژول توسط استاد آموزش داده شده (9 سال پیش)
 برای این سوال 4 پاسخ وجود دارد.
پاسخ به سوال 
Spirit  9 سال پیش
+1 0

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

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

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

پاسخ به سوال 
احسان منصوری  9 سال پیش
0 0

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

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

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

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

 

پاسخ به سوال 
Spirit  9 سال پیش
+2 0

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

پاسخ به سوال 
احسان منصوری  9 سال پیش
0 0

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

 

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

    }


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

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