【问题标题】:Android - Passing View from Activity to AsyncTask classAndroid - 将视图从 Activity 传递到 AsyncTask 类
【发布时间】:2013-12-27 06:27:45
【问题描述】:

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?

【问题讨论】:

标签: java android android-asynctask


【解决方案1】:

问题在于,例如加载过程中的方向变化,活动被重新创建,视图将不再有效。你冒着泄露活动的风险。此外,您尝试写入的视图将不再是可见的。

查看 Robospice 文档以了解基本问题: https://github.com/octo-online/robospice/wiki/Understand-the-basics-of-RoboSpice-in-30-seconds 这是 Android 中比较棘手的部分之一。

【讨论】:

    【解决方案2】:

    将 Activity 传递给 RemoteLoader 而不是 View,如下所示

    private WeakReference<Activity> activity;
    
    public RemoteLoader(Activity context){
        this.activity = new WeakReference<Activity>(context);
    }
    

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

    【讨论】:

    • 嗯,这个可行,但这就是你所说的活动泄漏@koljaTM 的意思吗?我的意思是,在这里将整个活动调用到一个班级听起来像是一项艰巨的任务。
    • 感谢 Dehan 和 Amulya 提供更新的答案。我也会在 RoboSpice 上进行更多探索。
    【解决方案3】:

    将此代码用于 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);
    }
    
    }
    

    【讨论】:

      【解决方案4】:

      您可以通过构造函数将 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);
          }
      
      }
      

      在您的主要活动中执行以下异步任务

      TextView txttitle = (TextView) view.findViewById(R.id.txtProtip);
      new RemoteLoader(txttitle).execute();
      

      如果你想从另一个异步任务中执行这个异步任务,那么通过 MainActivity 中的那个传递 textView 引用

      【讨论】:

        猜你喜欢
        • 2020-12-12
        • 1970-01-01
        • 1970-01-01
        • 2012-09-02
        • 1970-01-01
        • 1970-01-01
        • 2017-04-05
        • 1970-01-01
        • 2018-03-14
        相关资源
        最近更新 更多