【问题标题】:Unable to get data from from inner class [duplicate]无法从内部类获取数据 [重复]
【发布时间】:2015-09-22 09:20:38
【问题描述】:

我有一个在我的主类中扩展 AsyncTask 的内部类

public class MainActivity extends Activity {
String variable;
public onCreate(){

    onClickListener{
    new InnerClass().execute(params);
    variable // Here the value is always null
    }
}

class InnerClass extends AsyncTask<String,Void,JSONObject>{
    protected JSONObject doInBackground(String... params){
        /* Relevant Code 
        */
    }

    protected void onPostExecute(JSONObject result){
    variable = value; // required value being assigned to the variable
    }

}
}

我在内部类中为我的字符串变量“变量”分配了正确的值,但我无法访问我的主类中的值。

【问题讨论】:

  • 你不应该公开这样的公共变量。而是使用回调并在内部类中使用它来触发主类中的方法
  • 那是因为您正在查看异步任务设置之前的值...

标签: java android oop android-asynctask inner-classes


【解决方案1】:
new InnerClass().execute(params);
variable // Here the value is always null

您调用了execute,但您的主线程仍在继续,因此变量仍然为空,因为尚未调用AsyncTask.onPostExecute

【讨论】:

  • 这不是问题。问题是变量在内部类中设置之前在 main 中访问
  • 我回答了原始问题,没有编辑,所以也许我没有理解你。对不起。
  • 原问题中的问题是一样的。我只是稍微编辑了问题标题(后来又改回来了)
  • 是的,我知道,我尽快编辑了我的答案
【解决方案2】:

您使用异步任务,它为您创建线程来执行您的代码。您的变量为空,因为您的线程没有完成他的工作。

【讨论】:

    【解决方案3】:

    创建内部类对象。

    InnerClass inner=new InnerClass();
    String name=inner.name;
    

    就是这样。

    【讨论】:

      【解决方案4】:

      如果你想从你的异步任务中得到结果,你可以这样做: 异步任务的单独类:

      class InnerClass extends AsyncTask<String,Void,JSONObject>{
        protected JSONObject doInBackground(String... params){
          /* Relevant Code 
          */
        }
      }
      

      在你的活动中:

      public class MainActivity extends Activity {
        String variable;
        public onCreate(){
      
           onClickListener{
            startAsync();
           }
         }
        private void startAsync(){
               InnerClass task = new InnerClass(){
      
                protected void onPostExecute(JSONObject result){
                    variable = value;
                }
      
               };
               task.execute(params);
      
        }
       }
      

      这仅用于调整您的代码。更好的方法是在应用程序上下文中执行长任务,并通过 EventBus 将结果发送到活动/片段。 如果您使用上述实现,则必须在调用 onDestroy 时创建取消任务的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-20
        相关资源
        最近更新 更多