저는 비동기 작업에 상당히 익숙하지 않지만 클래스 레벨 변수에 액세스하는 내 응용 프로그램 용으로 만든 몇 가지 항목과 실제 장치에서 이러한 작업을 수행 할 때 doInBackground()에서 몇 가지 null 포인터 예외가 발생했습니다.Android - 비동기 작업에서 클래스 수준 변수에 액세스하는 것은 잘못된가요?
이 변수는 실제로 이러한 변수가 비동기 작업 내에서 액세스되어서는 안되며 대신 생성자 또는 매개 변수를 통해 전달되어야한다고 생각합니다. 예를 들어 액티비티 B로 전환하고 비동기 작업이 활동 A, A의 모든 변수는 null이되어야합니다.
그리고 이러한 변수에 액세스하는 것이 비동기 작업의 컨텍스트 내에서 절대 사용되어서는 안되는 경우 IDE (내 케이스의 Android Studio)가 위험한 행동이라고 경고하지 않아야합니까?
편집 : 너무 빨리 도움이됩니다. 다행히도 이것은 미래에 다른 사람들을 도울 것입니다.
public class MyActivity extends ActionBarActivity {
private Context mContext;
private User mUser;
private ProgressDialog mProgressDialog;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
mProgressDialog = new ProgressDialog(mContext);
mUser = new User();
new MyAsyncTask.execute();
}
private class MyAsyncTask extends AsyncTask<Params, Integer, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
mProgressDialog.setIndeterminate(true);
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setCancelable(true);
mProgressDialog.setMessage("My message");
mProgressDialog.show();
}
@Override
protected void onProgressUpdate(Integer... progress) {
super.onProgressUpdate(progress);
}
@Override
protected Void doInBackground(Params... params) {
Toast.makeText(mContext, "In doInBackground()", Toast.LENGTH_LONG).show();
mUser.someMethodThatTakesTime();
return null;
}
@Override
protected void onPostExecute(Void params) {
mProgressDialog.dismiss();
//Possibly launch another activity
}
}
}
스레드를 통해 올바르게 액세스하는 한 이러한 변수에 액세스하는 것이 완전히 괜찮은 경우가 있습니다. 귀하의 질문의 구체적인 감안할 때, 나는 당신의 생성자에 변수를 전달 향해 기댈 것입니다,하지만 당신이 관련 코드를 게시 한 후 최선의 추천 올 것이라고 생각합니다. – Phil
이 질문은 당신에게 유용 할 것이라고 생각합니다. http://stackoverflow.com/questions/154551/volatile-vs-interlocked-vs-lock?rq=1 – CurlyPaul