[英]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.