如何从内部 AsyncTask 访问片段
how to access a Fragment from the inner AsyncTask
我有一个 Fragment
和加载文本的内部 AsyncTask
:
public class TextReaderFragment extends Fragment {
LoadTextTask task = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setRetainInstance(true);
task=new LoadTextTask();
task.execute();
...
}
public void renderText() {
...
}
class LoadTextTask extends AsyncTask<Integer, Void, Boolean> {
@Override
protected void onPreExecute() {
// how to access Fragment or Activity here?
ProgressBar loader = (ProgressBar) findViewById(R.id.textLoadingProgressBar);
loader.setVisibility(TextView.VISIBLE);
}
@Override
protected void onPostExecute(Boolean loaded) {
// how to trigger renderText method defined on TextReaderFragment?
loader.setVisibility(TextView.GONE);
}
我不明白我怎么能:
- 从
onPreExecute()
方法访问 Fragment
或 Activity
以获取 Fragment
或 Activity
[=28= 中定义的 UI 小部件]
- 触发
renderText()
中定义的方法 TextReaderFragment
from onPostExecute()
?
逐点回答:
Fragment
可以访问为 TextReaderFragment.this
。
Activity
可以访问为 (MyActivity)getActivity()
。
renderText()
可以使用 TextReaderFragment.this.renderText()
. 调用
因为您没有声明您的 AsyncTask static
,所以它隐含地引用了它所包含的 class。要引用封闭 class 的实例,您必须使用带有 this 关键字的完全限定 class 名称,或者在您的情况下为 TextReaderFragment.this
。
有关嵌套 class 的工作原理的更详细说明,请参阅 this 教程。
我有一个 Fragment
和加载文本的内部 AsyncTask
:
public class TextReaderFragment extends Fragment {
LoadTextTask task = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
setRetainInstance(true);
task=new LoadTextTask();
task.execute();
...
}
public void renderText() {
...
}
class LoadTextTask extends AsyncTask<Integer, Void, Boolean> {
@Override
protected void onPreExecute() {
// how to access Fragment or Activity here?
ProgressBar loader = (ProgressBar) findViewById(R.id.textLoadingProgressBar);
loader.setVisibility(TextView.VISIBLE);
}
@Override
protected void onPostExecute(Boolean loaded) {
// how to trigger renderText method defined on TextReaderFragment?
loader.setVisibility(TextView.GONE);
}
我不明白我怎么能:
- 从
onPreExecute()
方法访问Fragment
或Activity
以获取Fragment
或Activity
[=28= 中定义的 UI 小部件] - 触发
renderText()
中定义的方法TextReaderFragment
fromonPostExecute()
?
逐点回答:
Fragment
可以访问为TextReaderFragment.this
。Activity
可以访问为(MyActivity)getActivity()
。renderText()
可以使用TextReaderFragment.this.renderText()
. 调用
因为您没有声明您的 AsyncTask static
,所以它隐含地引用了它所包含的 class。要引用封闭 class 的实例,您必须使用带有 this 关键字的完全限定 class 名称,或者在您的情况下为 TextReaderFragment.this
。
有关嵌套 class 的工作原理的更详细说明,请参阅 this 教程。