簡體   English   中英

Android - 將View從Activity傳遞到AsyncTask類

[英]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);
}

更新:使用弱引用來防止可能的內存泄漏。

將此代碼用於RemoteLoader: -

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM