AsyncTaskを実装し、それをFragmentにアタッチした後の基本的なデザインパターンを理解しようとします。私は、多くのチュートリアルと(何も与えない)実装されたコードは、次のとおり AsyncTaskが含まれている1)私の断片クラス:AsyncTaskをアタッチしたAndroidのフラグメントは、アクティビティでコミットした後に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のインスタンスを作成しないと仮定します。
質問:この(Fragment + AsyncTask)パターンを使用してProgressBarをバックグラウンドから更新するコードをどのように変更する必要がありますか?
別の質問:フラグメントonAttached(アクティビティa)は廃止予定です。これでonAttached(コンテキストコンテキスト)を使用する必要があります。つまり、次のように実装する必要がありますか?つまり、mCallback = (TaskCallback) context;
?
ありがとうございました! 'if(mTaskFragment == null)'は問題を解決します。それがいかに簡単か、どれくらい私がそれを見つけるのに苦労したかは恥ずかしいです。 –
問題はありません。あなたの他の質問を含めるように更新されました –