使用 AsyncTask 时闪烁屏幕



嘿伙计们,我知道这是一个常见问题,我使用 AsyncTaskActivity 让 JSON 解析器解析应用程序场景背后的一些 json,并使用 arrayadapter 泵送列表视图。这是我在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);
My 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中,什么都不会发生(数组列表没有抽列表视图(。所以我有点难倒,任何帮助将不胜感激,谢谢!

正如我在评论中所说,当您使用 Intent 再次启动同一活动时,您会在活动和 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);
}

然后正确实现异步任务:

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的良好实现,但应该可以让你开始。

最新更新