[英]Android - Passing View from Activity to AsyncTask class
MainActivity.java:
private class NetCheck extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... args) {
return cd.isConnectingToInternet();
}
protected void onPostExecute(Boolean th) {
if (th == true) {
new RemoteLoader(MainActivity.this).execute();
}
}
}
RemoteLoader.java:
public class RemoteLoader extends AsyncTask<Void, Void, Void>{
private View view;
public RemoteLoader(View context){
this.view = view;
}
@Override
protected Void doInBackground(Void... Pages) {
// do in bg
}
@Override
protected void onPostExecute(Void result) {
// Set title into TextView
TextView txttitle = (TextView) view.findViewById(R.id.txtProtip);
txttitle.setText(protip);
}
}
我正在尝试从MainActivity
执行RemoteLoader
类。 但是在RemoteLoader中包含需要膨胀Main布局的东西。
在这种情况下,如何将布局从MainActivity传递到RemoteLoader?
这样做的问题是,例如在加载过程中方向改变的情况下,将重新创建活动,并且视图将不再有效。 您有泄漏活动的风险。 此外,您尝试写入的视图将不再是可见的。
看一下Robospice文档,了解基本问题: https : //github.com/octo-online/robospice/wiki/Understand-the-basics-of-RoboSpice-in-30-seconds这是一个比较棘手的问题有关Android的部分。
将一个Activity传递给RemoteLoader而不是View,如下所示
private WeakReference<Activity> activity;
public RemoteLoader(Activity context){
this.activity = new WeakReference<Activity>(context);
}
更新:使用弱引用来防止可能的内存泄漏。
public class RemoteLoader extends AsyncTask<Void, Void, Void>{
LayoutInflater inflater;
int layoutResId;
public RemoteLoader(View context,int layoutResId){
this.view = view;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.layoutResId = layoutResId;
}
@Override
protected Void doInBackground(Void... Pages) {
// do in bg
}
@Override
protected void onPostExecute(Void result) {
// Set title into TextView
View yourLayout = inflater.inflate(layoutResId, null);
TextView txttitle = (TextView) yourLayout.findViewById(R.id.txtProtip);
txttitle.setText(protip);
}
}
您可以通过构造函数将TextView引用传递给异步任务类
public class RemoteLoader extends AsyncTask<Void, Void, Void>{
TextView txtTitle;
public RemoteLoader(TextView txtTitle){
this.txtTitle = txtTitle;
}
@Override
protected Void doInBackground(Void... Pages) {
// do in bg
}
@Override
protected void onPostExecute(Void result) {
// Set title into TextView
txttitle.setText(protip);
}
}
在您的主要活动中以follwos的身份执行异步任务
TextView txttitle = (TextView) view.findViewById(R.id.txtProtip);
new RemoteLoader(txttitle).execute();
如果要从另一个异步任务执行此异步任务,则通过MainActivity传递textView引用
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.