2016-03-19 11 views
0

私はRetriever.getCourses(username、password)を使ってダウンロードしましたが、後でValues.Coursesがnullに設定されているというエラーが表示されます。私はAsyncTaskを間違って書いたと思います。ありがとう!グレード断片中データをダウンロードして変数に保存する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()は、あなたの代わりにコースを返し、nullを返したdoInBackground内のエラー

@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

のようなコードを使用することができます私はValues.courses'は、いくつかの静的変数である 'と仮定していますか?あなたのAsyncTaskが、私は静的変数の代わりに使用すべきか 'ArrayListの' –

+0

内のクラスとの間でデータを渡すために静的変数を使うべきではないのですか? –

+0

を返すように定義されていないため、これはコンパイルべきではない、またAndroidの – Engima

答えて

0

を引き起こしています。あなたが返すものは、onPostExecuteのパラメータとして送信されます

+2

AsyncTaskがVoid、Void、Voidに設定されているからです。メソッドの戻り値の型がVoidの場合、null以外の戻り値はほとんどありません。 – GhostCat

+0

@Jägermeisterは正しいです。次の2つを変更する必要があります。 AsyncTask も返されます。 –

+0

@Jägermeister次に、onPostExecuteのパラメータは、パラメータのArraylistを持っていますか? –

0

コメントに記載され、my other answerと呼ばれるように、AsyncTaskは非同期なので、名前です。言い換えれば、onPostExecute内に割り当てた変数の値は保証されておらず、価値があると確信されるまで、それらの変数をアクティビティ/フラグメントで使用しないでください。

非同期性を適切に処理し、値を確保する方法は、コールバック関数を使用することです。そのリンクから、クラス間で結果を渡す汎用インターフェースを定義しました。

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

あなたは

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

ログインのためのようなあなたのAsyncTasksを定義することができ、コースに

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

通告を取得するには、単に転送インターフェースに対応沿って簡単なonPostExecuteコンストラクタで定義されています。

今、あなたのログインアクティビティでは、この

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

やコースでのフラグメント

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(); 
} 
関連する問題