【问题标题】:addOnScrollListener, pass base and limitaddOnScrollListener,传递base和limit
【发布时间】:2016-11-08 11:26:36
【问题描述】:

我正在学习如何使用 onscrolllistner

RecyclerOkHttpHandler 类将从服务器执行一个基数为 0 和限制为 5 的选择。我想要的是再次执行RecyclerOkHttpHandler 以获取新数据,例如base 5 limit 10。但是在 onscrolllistner 上添加以下内容时

       handler.execute().get();

我收到了这个错误:

Cannot execute task: the task has already been executed (a task can be executed only once)

好的,我知道我不能再次执行任务,但是我应该如何通过基础和限制?

这个(它正在工作)将执行一个从服务器获取图像的类,但是我需要传递基数 0 和限制 5

   final RecyclerOkHttpHandler handler = new RecyclerOkHttpHandler( this, new RecyclerOkHttpHandler.MyInterface() {
        @Override
        public void myMethod(ArrayList result) {
            mAdapter_first = new MyAdapter(result,SearchActivity.this);
            mAdapter_first.notifyDataSetChanged();
            mRecyclerView_first.setAdapter(mAdapter_first);
        }
    },"girls",base,limit);

    try {
         handler.execute().get();

    } catch (Exception e) {
       Log.d("SearchActivity error", "error in mRecyclerView_first");

        e.printStackTrace();
    }

这是addOnScrollListener,

 mRecyclerView_first.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            visibleItemCount = mRecyclerView_first.getChildCount();
            totalItemCount = mLayoutManager.getItemCount();
            firstVisibleItem = mLayoutManager.findFirstVisibleItemPosition();

            if (loading) {
                if (totalItemCount > previousTotal) {
                    loading = false;
                    previousTotal = totalItemCount;
                    System.out.println("previousTotal:" + previousTotal);
                    System.out.println("totalItemCount:" + totalItemCount);
                    System.out.println("visibleItemCount:" + visibleItemCount);

                }
            }
            if (!loading && (totalItemCount - visibleItemCount)
                    <= (firstVisibleItem + visibleThreshold)) {
                // End has been reached
                System.out.println(totalItemCount);

                Log.i("Yaeye!", "end called");
         //       base =String.valueOf(firstVisibleItem);
       //         limit=String.valueOf(visibleItemCount);

                // Do something
                try {
                    handler.execute().get();

                } catch (Exception e) {
                    Log.d("SearchActivity error", "error in mRecyclerView_first");

                    e.printStackTrace();
                }
                loading = true;
            }
        }
    });

这是类 RecyclerOkHttpHandler

public class RecyclerOkHttpHandler extends AsyncTask<String, Void, String> {
    private Context mContext;
    private MyInterface mListener;
    public String category;
    public String basestart;
    public String limitend;
    public RecyclerOkHttpHandler(Context context, MyInterface mListener, String categ, String base, String limit){
        mContext = context;
        this.mListener  = mListener;
        category=categ;
        basestart=base;
        limitend=limit;
    }
    public interface MyInterface {
        public void myMethod(ArrayList result);
    }

    private final String Fetch_URL = "http://justedhak.com/old-files/Recyclerview_data.php";
    // ArrayList<Listitem> Listitem;
    ArrayList<CategoryList> Listitem;
    int resulta;

    OkHttpClient httpClient = new OkHttpClient();
    ListView list;
    String myJSON;
    JSONArray peoples = null;
    InputStream inputStream = null;

    @Override
    protected String doInBackground(String... params) {
        Log.d("okhttp Fetch_URL", Fetch_URL);



        RequestBody formBody = new FormEncodingBuilder()
                .add("category", category)
                .add("base", basestart)
                .add("limit", limitend)
                .build();
        Request request = new Request.Builder()
                .url(Fetch_URL)
                .post(formBody)
                .build();


        String result = null;
        try {
            Response response = httpClient.newCall(request).execute();
            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
            inputStream = response.body().byteStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null)
            {
                sb.append(line + "\n");
            }
            result = sb.toString();
            resulta = 1; //"Success
            //  return response.body().bytes();
        } catch (Exception e) {
            Toast.makeText(mContext, "Connection failed, check your connection",
                    Toast.LENGTH_LONG).show();
            e.printStackTrace();        }
        finally {
            try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
        }
        return result;
    }
    @Override
    protected void onPostExecute(String result){
        if( resulta ==1){
            myJSON=result;
            Log.e("result",result);

            showList();
        }
        else{
            Log.e("d","there is an error on postexecute in okhhttphandler.java");

        }
    }

    protected void showList(){
        try {

            JSONObject jsonObj = new JSONObject(myJSON);
            peoples = jsonObj.getJSONArray("result");
            System.out.println("Length:"+peoples.length());
            int J_length=peoples.length()-1;
            //JSONObject maxj  = peoples.getJSONObject(peoples.length() - 1);
            // max of arrray

            jsonObj= peoples.getJSONObject(J_length);

            String j_id=  jsonObj.getString("id");
            int _id = Integer.parseInt(j_id);
            System.out.println(j_id);

            //max of
            DatabaseHandler db = new DatabaseHandler(mContext);
            String db_id="";
            db_id = db.getmax();
            if (db_id== null)
            {
                db_id="0";
            }
            int d_id = Integer.parseInt(db_id);
            Log.e("db_id", db_id);
            Log.e("j_id",j_id);

            //  if (_id < d_id) {
            System.out.println("Getting json result ");

            Listitem = new ArrayList<CategoryList>();
            for (int i = 0; i < peoples.length(); i++) {
                JSONObject c = peoples.getJSONObject(i);

                String id = c.getString("id");
                String url = c.getString("url");



                Listitem.add(new CategoryList(id, url));
            }

            if (mListener != null)
                mListener.myMethod(Listitem);


        } catch (JSONException e) {
            e.printStackTrace();
        }
    }





}

【问题讨论】:

  • RecyclerOkHttpHandler 扩展 AsyncTask?如果您调用 execute(),它将在后台执行其 doInBackground() 方法。此处不能使用 get(),必须重写 onPostExecute() 才能接收结果。
  • @ElDuderino ..override onPostExecute(); 怎么做?我应该如何修改我的代码?
  • 您能否将 RecyclerOkHttpHandler 的代码添加到您的问题中?

标签: android onscrolllistener


【解决方案1】:

我再次阅读了您的问题,解决方案可能只是每次都创建一个新的 RecyclerOkHttpHandler 。这就是错误消息所说的内容,这就是 AsyncTasks 的工作方式。如果你调用 .execute() 一旦你不能再次调用它,你必须创建一个新对象。

你仍然应该覆盖 onPostExecute() 否则你会阻塞 UI 线程。看看AsyncTask。 我需要 RecyclerOkHttpHandler 的代码说更多...

【讨论】:

  • 您好,感谢您的支持,老实说,我仍然面临创建load more 的问题,我是android 新手,我在业余时间开发了它。我更新了我的代码。如果您还需要什么,请告诉我
  • 你按照我说的做了吗?是否还出现Cannot execute task: the task has been executed (a task can be executed only once) 错误信息?
猜你喜欢
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2017-05-11
相关资源
最近更新 更多