首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自SQLite的回收视图首次显示为空页面

来自SQLite的回收视图首次显示为空页面
EN

Stack Overflow用户
提问于 2017-01-09 13:49:54
回答 2查看 78关注 0票数 0

我正在尝试从异步任务填充recyclerview。在异步任务中,通过API调用获取数据并将其推送到SQLite表中,然后从SQLite表中填充列表。列表在第一次加载时无法显示。但当我关闭该应用程序并重新打开该应用程序时,该列表就会出现。这是一个需要正确解决的一般性问题,还是我遗漏了其他问题?

代码语言:javascript
复制
public class KingsActivity extends AppCompatActivity {
    RecyclerView mRecyclerView;
    RecyclerView.Adapter mAdapter;
    RecyclerView.LayoutManager mLayoutManager;
    List<King> kingList=new ArrayList<King>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d("method_track","onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //To avoid the load on the main thread
        new DownloadDataAsync().execute(this);


    }

    public class DownloadDataAsync extends AsyncTask<Context, Integer, Context> {

        @Override
        protected Context doInBackground(Context... ctx) {
            downloadData(ctx[0]);
            return ctx[0];
        }

        @Override
        protected void onProgressUpdate(Integer... progress) {
        }

        @Override
        protected void onPostExecute(Context result) {

            Log.d("method_track","PostExecute");
            Cursor kingsRows=DatabaseHelper.getInstance(result.getApplicationContext()).getData(DatabaseHelper.TABLE_WESTEROS_KINGS);
            kingsRows.moveToFirst();
            while(kingsRows.moveToNext()){
                String kingName=kingsRows.getString(kingsRows.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_NAME));
                int battleCount=kingsRows.getInt(kingsRows.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_BATTLE_COUNT));
                int rating=kingsRows.getInt(kingsRows.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_RATING));
                kingList.add(new King(kingName,rating,battleCount));

            }
            kingsRows.close();


            mRecyclerView = (RecyclerView)findViewById(R.id.my_recycler_view);

            mLayoutManager = new LinearLayoutManager(result);
            mRecyclerView.setLayoutManager(mLayoutManager);
            mAdapter = new KingsAdapterRC(kingList,result);
            mRecyclerView.setAdapter(mAdapter);
            mAdapter.notifyDataSetChanged();
        }

        public void downloadData(final Context ctx){
            // Get a RequestQueue
            RequestQueue queue = HttpRequestHandler.getInstance(ctx.getApplicationContext()).
                    getRequestQueue();

            String url ="http://starlord.hackerearth.com/gotjson";
            // Request a string response from the provided URL.
            StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                            // Display the first 500 characters of the response string.
                            //Log.d("result_check",response.substring(0,500));

                            loadToDb(response,ctx);
                            populateList(ctx);
                            calculateRating(ctx);
                            logRatings(ctx);


                            //mTextView.setText("Response is: "+ response.substring(0,500));
                        }
                    }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d("result_check","Error");
                    //mTextView.setText("That didn't work!");
                }
            });

            // Add a request to RequestQueue.
            HttpRequestHandler.getInstance(ctx).addToRequestQueue(stringRequest);
        }
        protected void loadToDb(String jsonResponse,Context ctx){
            DatabaseHelper.getInstance(ctx.getApplicationContext()).truncate(DatabaseHelper.TABLE_WESTEROS_DATA);
            try {
                JSONArray jsonArray = new JSONArray(jsonResponse);
                for(int i=0;i<jsonArray.length();i++){
                    JSONObject jsonObj = (JSONObject)jsonArray.get(i);
                    Iterator<String> iter = jsonObj.keys();
                    HashMap<String,String> fieldVales=new HashMap<String, String>();
                    while (iter.hasNext()) {
                        String key = iter.next();
                        try {
                            Object value = jsonObj.get(key);
                            fieldVales.put(key,value.toString());

                        } catch (JSONException e) {
                            // Something went wrong!
                            Log.e("loadTodb",e.toString());
                        }
                    }
                    DatabaseHelper.getInstance(ctx.getApplicationContext()).insert(DatabaseHelper.TABLE_WESTEROS_DATA,fieldVales);
                }

            } catch (Throwable t) {
                //Log.e("My App", "Could not parse malformed JSON: \"" + json + "\"");
            }
        }
        protected void populateList(Context ctx){
            List<King> kingList=new ArrayList<King>();
            String[] kings;
            int kingsCount=0;
            String sql="SELECT DISTINCT "+DatabaseHelper.KEY_WESTEROS_ATTACKER_KING+ " FROM "+ DatabaseHelper.TABLE_WESTEROS_DATA
                    +" WHERE "+ DatabaseHelper.KEY_WESTEROS_ATTACKER_KING +" <> ''";
            Cursor rows=DatabaseHelper.getInstance(ctx.getApplicationContext()).getReadableDatabase().rawQuery(sql, null);
            kingsCount+=rows.getCount();



            String sql2="SELECT DISTINCT "+DatabaseHelper.KEY_WESTEROS_DEFENDER_KING + " FROM "+ DatabaseHelper.TABLE_WESTEROS_DATA
                    + " WHERE "+ DatabaseHelper.KEY_WESTEROS_DEFENDER_KING + " NOT IN ( "+sql+ " ) AND "
                    + DatabaseHelper.KEY_WESTEROS_DEFENDER_KING +" <> ''";

            Cursor rows2=DatabaseHelper.getInstance(ctx.getApplicationContext()).getReadableDatabase().rawQuery(sql2, null);
            kingsCount+=rows2.getCount();

            kings=new String[kingsCount];
            int i=0;

            if (rows.moveToFirst()) {
                while (!rows.isAfterLast()) {
                    //your code to implement
                    kings[i]=rows.getString(rows.getColumnIndex(DatabaseHelper.KEY_WESTEROS_ATTACKER_KING));
                    i++;
                    rows.moveToNext();
                }
            }
            rows.close();

            if (rows2.moveToFirst()) {
                while (!rows2.isAfterLast()) {
                    //your code to implement
                    kings[i]=rows2.getString(rows2.getColumnIndex(DatabaseHelper.KEY_WESTEROS_DEFENDER_KING));
                    i++;
                    rows2.moveToNext();
                }
            }
            rows2.close();


            DatabaseHelper.getInstance(ctx.getApplicationContext()).truncate(DatabaseHelper.TABLE_WESTEROS_KINGS);
            for(i=0;i<kingsCount;i++){
                HashMap<String,String> fieldValues=new HashMap<String, String>();
                fieldValues.put(DatabaseHelper.KEY_WESTEROS_KINGS_NAME,kings[i]);
                fieldValues.put(DatabaseHelper.KEY_WESTEROS_KINGS_RATING,"400");
                fieldValues.put(DatabaseHelper.KEY_WESTEROS_KINGS_BATTLE_COUNT,"0");
                DatabaseHelper.getInstance(ctx.getApplicationContext()).insert(DatabaseHelper.TABLE_WESTEROS_KINGS,fieldValues);
            }
        }


        protected void calculateRating(Context ctx){
            Cursor battles_cur=DatabaseHelper.getInstance(ctx.getApplicationContext()).getData(DatabaseHelper.TABLE_WESTEROS_DATA);

            if(battles_cur.moveToFirst()){
                while(!battles_cur.isAfterLast()){
                    String attackingKing=battles_cur.getString(battles_cur.getColumnIndex(DatabaseHelper.KEY_WESTEROS_ATTACKER_KING));
                    String defendingKing=battles_cur.getString(battles_cur.getColumnIndex(DatabaseHelper.KEY_WESTEROS_DEFENDER_KING));


                    if(!attackingKing.equals("") && !defendingKing.equals("")){

                        HashMap<String,String> whereConDfk=new HashMap<String,String>();
                        whereConDfk.put(DatabaseHelper.KEY_WESTEROS_KINGS_NAME,defendingKing);
                        Cursor cursor1=DatabaseHelper.getInstance(ctx.getApplicationContext()).getData(DatabaseHelper.TABLE_WESTEROS_KINGS,whereConDfk);
                        double defKing_rating;
                        double defKing_battleCount;
                        if(cursor1.moveToFirst()){

                            defKing_rating=cursor1.getDouble(cursor1.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_RATING));
                            defKing_battleCount=cursor1.getDouble(cursor1.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_BATTLE_COUNT));
                            cursor1.close();

                            HashMap<String,String> whereConAtk=new HashMap<String,String>();
                            whereConAtk.put(DatabaseHelper.KEY_WESTEROS_KINGS_NAME,attackingKing);
                            Cursor cursor2=DatabaseHelper.getInstance(ctx.getApplicationContext()).getData(DatabaseHelper.TABLE_WESTEROS_KINGS,whereConAtk);
                            Double atkKing_rating;
                            Double atkKing_battleCount;
                            if(cursor2.moveToFirst()){

                                atkKing_rating=cursor2.getDouble(cursor2.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_RATING));
                                atkKing_battleCount=cursor2.getDouble(cursor2.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_BATTLE_COUNT));
                                cursor2.close();
                                atkKing_battleCount++;
                                defKing_battleCount++;

                                Double defKing_rating_tr=Math.pow(10,(defKing_rating/400));
                                Double atkKing_rating_tr=Math.pow(10,(atkKing_rating/400));

                                Double defKing_rating_ex=defKing_rating_tr/(defKing_rating_tr+atkKing_rating_tr);
                                Double atkKing_rating_ex=atkKing_rating_tr/(defKing_rating_tr+atkKing_rating_tr);

                                String attackerStatus=battles_cur.getString(battles_cur.getColumnIndex(DatabaseHelper.KEY_WESTEROS_ATTACKER_OUTCOME));

                                Double atkKing_rating_new=atkKing_rating;
                                Double defKing_rating_new=defKing_rating;
                                if(attackerStatus.equals("win")){
                                    atkKing_rating_new=atkKing_rating+(32*(1-atkKing_rating_ex));
                                    defKing_rating_new=defKing_rating+(32*(0-defKing_rating_ex));
                                }else if(attackerStatus.equals("loss")){
                                    atkKing_rating_new=atkKing_rating+(32*(0-atkKing_rating_ex));
                                    defKing_rating_new=defKing_rating+(32*(1-defKing_rating_ex));
                                }else if(attackerStatus.equals("draw")){
                                    atkKing_rating_new=atkKing_rating+(32*(0.5-atkKing_rating_ex));
                                    defKing_rating_new=defKing_rating+(32*(0.5-defKing_rating_ex));
                                }
                                String update_atkKing_ratingQuery="UPDATE "+ DatabaseHelper.TABLE_WESTEROS_KINGS + " SET "
                                        + DatabaseHelper.KEY_WESTEROS_KINGS_RATING+" = "+atkKing_rating_new+", "
                                        + DatabaseHelper.KEY_WESTEROS_KINGS_BATTLE_COUNT+" = "+atkKing_battleCount
                                        + " WHERE "+ DatabaseHelper.KEY_WESTEROS_KINGS_NAME +" =\""+attackingKing+"\"";

                                String update_defKing_ratingQuery="UPDATE "+ DatabaseHelper.TABLE_WESTEROS_KINGS + " SET "
                                        + DatabaseHelper.KEY_WESTEROS_KINGS_RATING+" = "+defKing_rating_new+", "
                                        + DatabaseHelper.KEY_WESTEROS_KINGS_BATTLE_COUNT+" = "+defKing_battleCount
                                        + " WHERE "+ DatabaseHelper.KEY_WESTEROS_KINGS_NAME +" =\""+defendingKing+"\"";

                                DatabaseHelper.getInstance(ctx.getApplicationContext()).getWritableDatabase().execSQL(update_atkKing_ratingQuery);
                                DatabaseHelper.getInstance(ctx.getApplicationContext()).getWritableDatabase().execSQL(update_defKing_ratingQuery);

                            }

                        }
                    }
                    battles_cur.moveToNext();
                }
            }

        }
        protected void logRatings(Context ctx){
            Log.d("method_track","logratings");
            Cursor kings_cur=DatabaseHelper.getInstance(ctx.getApplicationContext()).getData(DatabaseHelper.TABLE_WESTEROS_KINGS);
            try {
                while (kings_cur.moveToNext()) {

                    String name=kings_cur.getString(kings_cur.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_NAME));
                    String rating=kings_cur.getString(kings_cur.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_RATING));
                    String battleCount=kings_cur.getString(kings_cur.getColumnIndex(DatabaseHelper.KEY_WESTEROS_KINGS_BATTLE_COUNT));
                    //Log.d("method_track", "logratings");
                    Log.d("rating_inspect",name+" - "+rating+" - "+battleCount);

                }
            }finally {
                kings_cur.close();
            }

        }
    }



}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-09 14:02:39

这里:

代码语言:javascript
复制
downloadData(ctx[0]);

downloadData方法导致的问题。

downloadData方法中,使用StringRequest从服务器获取数据。StringRequest处理工作线程上的所有请求,并使用Response.Listener返回结果。

doInBackground还完成了工作线程上的所有工作。因此doInBackground方法的工作线程只执行downloadData方法,而不等待从StringRequest获得响应。

在使用StringRequest时不需要使用额外的线程。只需删除AsyncTask并只使用StringRequest即可使其正常工作。

票数 0
EN

Stack Overflow用户

发布于 2017-01-09 14:15:40

Yo不应该从doInBackground调用volley StringRequest,因为async task会立即执行post execute方法,您的列表将为空,因此不会显示任何数据。只需使用string request并在获得响应后,将其保存在您的‘数据库’中并从那里获取(您可以直接保存并从database获取数据,也可以使用异步任务)。

不仅仅是在没有任何async task的情况下使用StringRequest并进行测试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41541734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档