Мигающий экран при использовании AsyncTask - PullRequest
0 голосов
/ 04 июня 2018

Эй, ребята, я знаю, что это распространенная проблема, я использую AsyncTaskActivity, чтобы JSON-анализатор анализировал некоторые json за кулисами приложения и накачивал представление списка с помощью адаптера массива.Это мой код в файле mainActivity.java.Мой экран мерцает всякий раз, когда я начинаю заниматься белво.

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);), но если я сохраню его в onPostExcute, то ничего не произойдет (hte arraylist)не качает представление списка). Так что я немного озадачен, любая помощь будет оценена спасибо!

1 Ответ

0 голосов
/ 04 июня 2018

Как я уже сказал в своем комментарии, вы вводите рекурсивный вызов между действием и AsyncTask, когда вы снова запускаете то же действие с намерением.Вместо этого, поскольку вы уже передаете экземпляр действия в AsyncTask, просто создайте метод обновления в действии и используйте его из 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);
}

Затем правильно внедрите 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);
}
//...

Это не очень хорошая реализация AsyncTask, но она должна помочь вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...