AsyncTask를 구현하고 Fragment에 연결하는 기본 디자인 패턴을 이해하려고합니다. 나는 많은 자습서 및 (아무것도 제공하지 않습니다) 구현 코드를 따르 AsyncTask를 들어 있습니다 1) 내 조각 클래스 :AsyncTask가 첨부 된 Android Fragment가 액티비티의 커밋 후 null을 제공함
public class MainActivity extends ActionBarActivity implements MyFragment.TaskCallback
{
private ProgressBar mProgress;
private MyFragment mTaskFragment;
private final static String TAG_FRAGMENT = "Fragment Task";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mProgress = (ProgressBar) findViewById(R.id.progressBar1);
mProgress.setProgress(0);
//create fragment manager and fragment instance
FragmentManager mFM = getSupportFragmentManager();
mTaskFragment = (MyFragment) mFM.findFragmentByTag(TAG_FRAGMENT);
if(mFM == null)
{
mTaskFragment = new MyFragment();
mFM.beginTransaction().add(mTaskFragment, TAG_FRAGMENT).commit();
}
//I added this method, but to no help, the same without this method
mFM.executePendingTransactions();
}
@Override
public void onPreExecute()
{
mProgress.setVisibility(View.VISIBLE);
}
@Override
public void onProgressUpdate(Integer... i)
{
mProgress.setProgress(i[0]);
}
@Override
public void onPostExecute()
{
mProgress.setVisibility(View.INVISIBLE);
}
}
기본적으로
public class MyFragment extends Fragment
{
public interface TaskCallback
{
void onPreExecute();
void onProgressUpdate(Integer... i);
void onPostExecute();
}
private TaskCallback mCallback;
private Task mTask;
@Override
public void onAttach(Activity activity)
{
super.onAttach(activity);
mCallback = (TaskCallback) activity;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setRetainInstance(true);
mTask = new Task();
mTask.execute();
}
private class Task extends AsyncTask<Void, Integer, Void>
{
@Override
protected void onPreExecute()
{
mCallback.onPreExecute();
}
@Override
protected Void doInBackground(Void... params)
{
for (int i=0; i<100; i++)
{
publishProgress(i*10);
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values)
{
mCallback.onProgressUpdate(values);
}
@Override
protected void onPostExecute(Void aVoid)
{
mCallback.onPostExecute();
}
}
}
2) 내 주요 활동 코드, 코드에 의해 실행시 디버그,
후mTaskFragment = (MyFragment) mFM.findFragmentByTag(TAG_FRAGMENT);
if(mFM == null)
{
mTaskFragment = new MyFragment();
mFM.beginTransaction().add(mTaskFragment, TAG_FRAGMENT).commit();
}
는 mTaskFragment = null
여기에 문제가 있다고 가정합니다 (mTaskFragment = null). 코드가 MyFragment의 인스턴스를 만들지 않습니다.
질문 :이 (조각 + AsyncTask) 패턴을 사용하여 백그라운드에서 ProgressBar를 업데이트하는 코드를 어떻게 변경해야합니까?
다른 질문 : onAttached (Activity a) 단편이 사용되지 않으므로 이제는 onAttached (Context context)를 사용해야합니다. 즉, 다음과 같이 구현되어야합니다 : mCallback = (TaskCallback) context;
?
감사합니다 (당신의 활동이 인터페이스를 구현되어 있는지 확인) 괜찮습니다! 'if (mTaskFragment == null)'는 문제를 해결합니다. 그것이 얼마나 간단한 지 당황스럽고 그것을 찾기 위해 얼마나 많은 어려움을 겪었습니다. –
다른 질문을 포함하도록 문제가 없으며 업데이트되었습니다. –