2016-03-19 18 views
0

İndirme bölümünü Retriever.getCourses (kullanıcı adı, parola) kullanarak yaptım, ancak aşağıdaki kod, Values.Courses deyiminin null olarak ayarlanmasından sonra bana bir hata veriyor. Sanırım AsyncTask'ı yanlış yazdım. Teşekkürler! Veri indirmek ve değişkene kaydetmek için asynctask?


sınıflar fragmanında
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); 
    } 
} 

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

} 
. courses.size() yerine ders iade null döndü doInBackground iç hata

@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; 

} 
+0

Fragment Kurslarda kodu kullanabilirsiniz 'Values.courses' bazı statik değişkendir? Android –

+0

sınıfları arasında veri geçirmek için statik değişkenler kullanmamalısınız Ayrıca, bu AsyncTask, 'ArrayList ' –

+0

döndürme olarak tanımlanmadığı için derlenmemelidir, statik değişkenler yerine ne kullanmalıyım? – Engima

cevap

0

neden oluyor. Geri döndüğünüzde, onPostExecute

+2

AsyncTask Void, Void, Void için yapılandırılmış olduğundan sanırım. Bir yöntemin dönüş türü geçersiz olduğunda, null dışında geri dönebileceğiniz başka bir şey yoktur. – GhostCat

+0

@ Jägermeister doğru. Aşağıdaki iki şeyi değiştirmelisiniz: , AsyncTask 'u da genişletir; –

+0

@ Jägermeister O zaman onPostExecute parametresinin parametre için bir Arraylist'i var mı? –

0

için bir parametre olarak gönderilir. Yorumlarda belirtildiği ve my other answer'a atıf yapılan bir AsyncTask, eşzamansızdır, dolayısıyla ad. Diğer bir deyişle, onPostExecute içinde atadığınız değişkenleriniz için bir değer garanti etmezsiniz ve bu değişkenleri, bir değere sahip olduklarından emin olmadan, Etkinlikleriniz/Fragmanlarınızda kullanmamalısınız.

Eşzamansız doğayı uygun şekilde işlemenin ve bir değerin olduğundan emin olmanın yolu bir geriçağırım işlevi kullanmaktır. Bu bağlantıdan, sınıflar arasındaki sonuçları iletmek için genel bir arayüz tanımladım.

public interface AsyncResponse<T> { 
    void onResponse(T response); 
} 

Sen

public class UserLoginTask extends AsyncTask<Void, Void, Boolean> { 

    private final String muser; 
    private final String mPassword; 
    private final AsyncResponse<Boolean> callback; 

    public UserLoginTask(String user, String password, AsyncResponse<Boolean> callback) { 
     this.muser = user; 
     this.mPassword = password; 
     this.callback = callback; 
    } 

    @Override 
    protected Boolean doInBackground(Void... voids) { 

     boolean login = false; 

     // TODO: Some network operation 
     try { 
      login = doLogin(this.muser, this.mPassword); 
     } catch (Exception e) { 
      Log.e("LoginError", e.getMessage()); 
     } 

     return login; 
    } 

    @Override 
    protected void onPostExecute(Boolean response) { 
     if (callback != null) { 
      callback.onResponse(response); 
     } 
    } 
} 

giriş için böyle gibi AsyncTasks tanımlayabilirsiniz Ve dersleri

public class GetCoursesTask extends AsyncTask<Void, Void, List<Course>> { 

    private final String username; 
    private final String password; 
    private final AsyncResponse<List<Course>> callback; 

    public GetCoursesTask(String username, String password, AsyncResponse<List<Course>> callback) { 
     this.username = username; 
     this.password = password; 
     this.callback = callback; 
    } 

    @Override 
    protected List<Course> doInBackground(Void... voids) { 
     List<Course> courses = new ArrayList<Course>(); 

     // TODO: Some network operation 
     try { 
      courses.addAll(getCourses(username, password)); 
     } catch (Exception e) { 
      Log.e("GetCoursesError", e.getMessage()); 
     } 

     return courses; 
    } 

    @Override 
    protected void onPostExecute(List<Course> response) { 
     if (callback != null) { 
      callback.onResponse(response); 
     } 
    } 
} 

Bildirimi almak için basitçe ileri arayüzüne yanıt boyunca basit onPostExecute kurucuda tanımlanmıştır.

Şimdi, Oturum Faaliyeti, bu

UserLoginTask loginTask = new UserLoginTask(
     "username", 
     mPasswordView.getText().toString(), 
     new AsyncResponse<Boolean>() { 
      @Override 
      public void onResponse(Boolean response) { 
       if (response) { 
        // TODO: Save data in SharedPreference 
        Intent loginIntent = new Intent(LoginActivity.this, CoursesActivity.class); 
        loginIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
        startActivity(loginIntent); 
        finish(); 
       } else { 
        mPasswordView.setError("Incorrect Password"); 
        mPasswordView.requestFocus(); 
       } 
      } 
     } 
); 
loginTask.execute(); 

gibi Ve ben tahmin ediyorum

private CourseAdapter adapter; 
private ListView yourListView; 
private ProgressDialog progress; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View v = inflater.inflate(R.layout.fragment_grades, container, false); 

    this.yourListView = (ListView) v.findViewById(R.id.listview); 
    this.adapter = new CourseAdapter(getContext(), new ArrayList<Course>()); 
    this.yourListView.setAdapter(adapter); 

    this.progress = new ProgressDialog(getContext()); 
    this.progress.setMessage("Loading Courses..."); 

    fetchCourses(); 

    return v; 
} 

private void fetchCourses() { 
    this.progress.show(); 

    GetCoursesTask getCoursesTask = new GetCoursesTask(
      "username", 
      "password", 
      new AsyncResponse<List<Course>>() { 
       @Override 
       public void onResponse(List<Course> response) { 
        adapter.clear(); 
        adapter.addAll(response); 
        adapter.notifyDataSetChanged(); 

        progress.hide(); 
       } 
      }); 
    getCoursesTask.execute(); 
} 
İlgili konular