【发布时间】:2016-03-19 14:59:31
【问题描述】:
我已经使用 Retriever.getCourses(username,password) 完成了下载部分,但是下面的代码在稍后将 Values.Courses 设置为 null 时给了我一个错误。我想我写错了 AsyncTask。谢谢!
public class UserLoginTask extends AsyncTask<Void, Void, Boolean> {
private final String muser;
private final String mPassword;
private boolean checked;
private ArrayList<Course> crs;
private String name;
private ArrayList<Teacher> tc;
UserLoginTask(String user, String password) {
muser = user;
mPassword = password;
}
@Override
protected Boolean doInBackground(Void... params) {
// TODO: attempt authentication against a network service.
try {
return Retriever.logInTest(muser, mPassword);
} catch (Exception e) {
return false;
}
// TODO: register the new account here.
}
@Override
protected void onPostExecute(final Boolean success) {
mAuthTask = null;
showProgress(false);
if (success) {
SharedPreferences sharedPref = Login.this.getSharedPreferences("Login",Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("Username", muser);
editor.putString("Password", mPassword);
crs = Retriever.getCourses(muser, mPassword);
Values.courses = crs;
editor.commit();
Intent intent = new Intent(Login.this,MainActivity.class);
startActivity(intent);
finish();
} else {
mPasswordView.setError(getString(R.string.error_incorrect_password));
mPasswordView.requestFocus();
}
}
@Override
protected void onCancelled() {
mAuthTask = null;
showProgress(false);
}
}
public class UserCourseTask extends AsyncTask<Void, Void, ArrayList>{
private String username;
private String password;
private ArrayList<Course> courses;
public UserCourseTask(String user, String pass)
{
username = user;
password = pass;
}
protected ArrayList doInBackground(Void... params)
{
try{
courses = Retriever.getCourses(username,password);
return courses;
}
catch (Exception e){
Log.e("MYAPP", "exception", e);
}
return courses;
}
protected void onPostExecute(ArrayList<Course> result)
{
setCourses(result);
}
}
在成绩片段中。 courses.size() 导致错误
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootview = inflater.inflate(R.layout.fragment_grades, container, false);
ListView yourListView = (ListView) rootview.findViewById(R.id.listview);
ArrayList<Course> courses = Values.courses;
for(int i = 0; i<courses.size();i++)
{
if(courses.get(i).getSubject().equals("Lunch"))
{
courses.remove(i);
break;
}
}
yourListView.setAdapter(new CourseAdapter(rootview.getContext(),courses));
yourListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Values.assignments = Values.courses.get(position).getAssignments();
Values.assingmentsclass = Values.courses.get(position).getSubject();
Intent intent = new Intent(getActivity(), Scrnassign.class);
startActivity(intent);
}
});
return rootview;
}
【问题讨论】:
-
我假设
Values.courses是一些静态变量?您不应该使用静态变量在 Android 中的类之间传递数据 -
另外,这不应该编译,因为您的 AsyncTask 未定义为返回
ArrayList<Course> -
我应该使用什么来代替静态变量?
-
通过接口异步回调你的Activity。 stackoverflow.com/a/35210468/2308683
-
它仍然说
Values.courses为空,因为 AsyncTask 没有执行并立即得到结果。因此类的异步部分......你必须等到 doInBackground 和 onPostExecute 结束才能使用你的变量。
标签: java android android-asynctask