java - 使用 AsyncTask 时屏幕闪烁

标签 java android android-asynctask

大家好,我知道这是一个常见问题,我使用 AsyncTaskActivity 让 JSON 解析器在应用程序的后台解析一些 json,并使用 arrayadapter 抽取 ListView 。这是我在 mainActivity.java 中的代码代码。每当我进行 belwo Activity 时,我的屏幕就会闪烁。

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();


    }



}

我做了一些故障排除,发现错误与传递数组列表的 Intent 的放置有关。但这就是问题所在,如果我将它放在 doinBackground() 中,屏幕会快速闪烁(这很可能是因为它一直在调用 (setContentView(R.layout.activity_see_schedule_activity);) 但如果我将它放在 onPostExcute 中,则什么也不会发生(hte arraylist不抽 ListView )。所以我有点难过,任何帮助将不胜感激谢谢!

最佳答案

正如我在评论中所说,当您使用 Intent 再次启动相同的 Activity 时,您会在 Activity 和 AsyncTask 之间输入递归调用。相反,因为您已经将 Activity 实例传递给 AsyncTask,只需在 Activity 中创建一个更新方法并使用 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 的良好实现,但应该可以让您继续。

关于java - 使用 AsyncTask 时屏幕闪烁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50684897/

相关文章:

android - AsyncTask 取消不起作用

java-将参数传递给主方法

java - 源栅格波段和源色彩空间分量的数量不匹配

java - 为什么我们需要二维数组?

java - Android 蓝牙发现

android - android 中的JSON 对象中具有相同名称的多个JSON 数组?

java - AVD 不会停止关闭

android - 应用程序崩溃了..找到了有关logcat的解释,但不知道为什么

Android:为 AsyncTask 设置超时

Android loopj asynchttpclient 返回响应