代码之家  ›  专栏  ›  技术社区  ›  jewstin

使用asynctask时屏幕闪烁

  •  1
  • jewstin  · 技术社区  · 6 年前

    嘿,伙计们,我知道这是一个常见的问题,我使用一个asynctaskactivity让一个json解析器解析应用程序场景背后的一些json,并用一个arrayadapter泵送一个listview。这是我mainactivity.java中的代码。每当我进入belwo活动时,我的屏幕就会闪烁。

    setContentView(R.layout.activity_see_schedule_activity);
            this.setTitle("Activity Schedule");
            //Log.e("ID see schedule#",getIntent().getExtras().getString("id#"));
            RequestQueue queue = Volley.newRequestQueue(see_schedule_activity.this);
            StringRequest request = new StringRequest(Request.Method.POST, httpUpdateRoutines, new Response.Listener<String>() {
    
    
                @Override
                public void onResponse(String response) {
    
                    Toast.makeText(see_schedule_activity.this, "" + response, Toast.LENGTH_SHORT).show();
    
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(see_schedule_activity.this, "Data Not Fetched " + error, Toast.LENGTH_SHORT).show();
    
                }
            }) {
                @Override
                protected Map<String, String> getParams() throws AuthFailureError {
    
    
                    Map<String, String> map = new HashMap<String, String>();
    
                    //Log.e("ID see schedule#",getIntent().getExtras().getString("id#"));
                    map.put("residentid", getIntent().getExtras().getString("id#"));
                    return map;
                }
            };
    
            queue.add(request);
    
            new AsyncTaskParseJson(this).execute();
    
    
    
    
            ArrayList<String> schedulelist = getIntent().getExtras().getStringArrayList("tasks_filled");
    
            ArrayAdapter adapter = new ArrayAdapter<String>(this,
                    R.layout.activity_listview, schedulelist);
    
            ListView listView = (ListView) findViewById(R.id.schedulelist);
            listView.setAdapter(adapter);
    我的asynctaskparsejson.java

    public class AsyncTaskParseJson extends AsyncTask<String, String, String> {
    
    
        private Context c;
    
        String schedule;
        String activityid;
        String routine;
        String[] tasks;
    
    
        ArrayList<String> schedulelist = new ArrayList<String>();
        final String TAG = "AsyncTaskParseJson.java";
        // set your json string url here
        String yourJsonStringUrl = "http://www.wirelesshealth.wayne.edu/nhcheckup/getData(justin).php";
        // contacts JSONArray
        JSONArray dataJsonArr = null;
    
        public AsyncTaskParseJson(Context applicationContext) {
                this.c=applicationContext;
        }
    
    
        @Override
        protected void onPreExecute() {}
    
        @Override
        protected String doInBackground(String... arg0) {
            try {
    
    
                HashMap<Integer, String> hm = new HashMap<Integer, String>();
              -----------------------some hash -----------------
    
                // instantiate our json parser
                JsonParser jParser = new JsonParser();
    
                // get json string from url
                JSONObject json = jParser.getJSONFromUrl(yourJsonStringUrl);
    
                // get the array of users
                dataJsonArr = json.getJSONArray("schedule");
    
    
    
                // loop through all users
                for (int i = 0; i < dataJsonArr.length(); i++) {
                    Log.e("doInBackground","YOU GOT HERE");
    
                    JSONObject c = dataJsonArr.getJSONObject(i);
    
                    // Storing each json item in variable
    
                    activityid = c.getString("activityid");
    -------------------------------Pasres object c --------------
                }
                Intent intent = new Intent(c,see_schedule_activity.class);
               -- passes back arraylist -------------- intent.putStringArrayListExtra("tasks_filled",schedulelist);
                this.c.startActivity(intent);
                ((Activity)c).finish();
    
    
            } catch (JSONException e) {
                e.printStackTrace();
            }
    
            return null;
        }
    
    
        @Override
        protected void onPostExecute(String strFromDoInBg) {
    //        Intent intent = new Intent(see_schedule_activity.this,see_schedule_activity.class);
    //        intent.putExtra("tasks_filled",tasks);
    //        this.c.startActivity(intent);
    //        ((Activity)c).finish();
    
    
        }
    
    
    
    }

    我做了一些疑难解答,发现错误与传递数组列表的意图的位置有关。但问题是,如果我把它放在doinbackground()中,屏幕会快速闪烁(这主要是因为它会继续调用(setContentView(r.layout.activity_see_schedule_activity)),但如果我将其保留在postexcute中,则不会发生任何事情(arraylist不会启动listView)。所以我有点难堪,任何帮助都将不胜感激谢谢!

    1 回复  |  直到 6 年前
        1
  •  1
  •   user Roman    6 年前

    正如我在我的评论中所说的,当您带着意图再次启动同一个活动时,在活动和异步任务之间输入一个递归调用。相反,当您已经将活动实例传递给asynctask时,只需在活动中创建一个update方法并从asynctask中使用它:

    // field in see_schedule_activity
    private ArrayAdapter<String> adapter;
    
    // which you'll initialize in onCreate()
    // with an empty list, as you don't yet have the data
    ...
    adapter = new ArrayAdapter<String>(this,
                R.layout.activity_listview, new ArrayList<>());
    
    ListView listView = (ListView) findViewById(R.id.schedulelist);
    listView.setAdapter(adapter); 
    ... rest of onCreate()
    
    public void update(List<String> results) {
        adapter.clear();
        adapter.addAll(results);
    }
    

    然后正确实现异步任务:

    public class AsyncTaskParseJson extends AsyncTask<String, Void, List<String>> {    
    
    
    private see_schedule_activity activity;
    //... the rest
    
    public AsyncTaskParseJson(see_schedule_activity activity) {
        this.activity = activity;
    }
    
    @Override
    protected List<String> doInBackground(String... arg0) {
        // create scheduleList 
        return scheduleList;
    }
    
    @Override
    protected void onPostExecute(List<String> results) {
        activity.update(results);
    }
    //...
    

    这不是asynctask的一个很好的实现,但是应该可以让您开始。