使用AsyncTask时闪烁屏幕

时间:2018-06-04 16:22:09

标签: java android android-asynctask

嘿伙计我知道这是一个常见的问题,我使用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);
&#13;
&#13;
&#13; 我的AsyncTaskparseJson.java

&#13;
&#13;
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();


    }



}
&#13;
&#13;
&#13;

我做了一些麻烦,发现错误与传递数组列表的意图的位置有关。但是问题就在这里,如果我把它放在doinBackground()中,屏幕会快速闪烁(这是多余的,因为它保持调用(setContentView(R.layout.activity_see_schedule_activity);)但是如果我把它保存在onPostExcute中没什么发生了(因为arraylist没有抽出listview)。所以我有点难过,任何帮助都将不胜感激谢谢!

1 个答案:

答案 0 :(得分:1)

As I said in my comment, you enter a recursive call between the activity and the AsyncTask as you start the same activity again with an Intent. Instead, as you already pass the activity instance to the AsyncTask, simply create an update method in the activity and use that from the 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);
}

Then implement correctly the AsyncTask:

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);
}
//...

This is not a good implementation of the AsyncTask but should get you going.