【问题标题】:variable not getting updated in doInBackground method of AsyncTaskAsyncTask 的 doInBackground 方法中未更新变量
【发布时间】:2012-01-19 00:32:38
【问题描述】:

我正在尝试使用以下代码来获取 result 值,但它似乎永远不会更新。我正在检查名为startPosting() 的类中的结果:

public class PostDataThread extends AsyncTask<Void, Void, Void> {

  String [] data;
  Context context;
  int result = 0;

  public int startPosting(int type,String data[], Context c) {
    this.data = data;
    this.context = c;
    this.execute();
    return result;
  }

  @Override
  protected Void doInBackground(Void... params) {
    Connect c = new Connect();
    c.start(Constant.RECEIVED_MESSAGE, data, context);
    result = 444;
    return null;
  }

  protected void onPostExecute(Integer result) {
    //          
  }

}

【问题讨论】:

  • 什么是result?请更清楚地解释您的问题。
  • @MisterSquonk 结果(int) 是可变的。我在声明时将其初始化为任意值。执行doInBackground方法(this.execute()从同一个类调用)后,结果没有变化
  • 我们要么不知道Connect 是什么。 c.start(...) 是否有可能返回与以前相同的结果?请提供更多源代码,以便我们为您提供帮助并了解发生了什么。
  • @Rafael T connect 在后台做一些事情。是的,有可能返回相同的结果。但是,我尝试将其修改为“result = newValue;”。但是,同样的旧值。而且我也无法在调试模式下跟踪“结果”!
  • 你什么时候检查result的值?在onPostExecute 之后,还是您希望在调用AsyncTask 之后立即设置result?不要忘记 AsyncTask 是异步的

标签: java android android-asynctask


【解决方案1】:

result 没有得到更新的原因是因为您试图在拨打AsyncTask 之后立即检查它。

您可以通过以下方式重新构建它:

public class PostDataThread extends AsyncTask<Void, Void, Integer> {

  String [] data;
  Context context;
  int res = 0;

  public PostDataThread(int type, String data[], Context c) {
    this.data = data;
    this.context = c;
  }

  @Override
  protected Void doInBackground(Void... params) {
    Connect c = new Connect();
    c.start(Constant.RECEIVED_MESSAGE, data, context);
    res = 444;
    return res;
  }

  @Override
  protected void onPostExecute(Integer result) {
    Log.d(TAG, "Result is: " +result);
  }

}

并称它为:

PostDataThread p = new PostDataThread(type, data, context);
p.execute();

然后修改onPostExecute以使用result做任何你需要做的事情。

【讨论】:

  • @sushantkr 现在这样有意义吗?
【解决方案2】:

如果结果是 int 试试这个:

public class MyActivity extends Activity{
    private int result = 0

    private class MyTask extends AsyncTask<Integer, Void, Integer>{
         public Integer doInBackground(Integer... arg){
             //Conncet c = new Connect();
             //result=c.start(Constant.RECEIVED_MESSAGE, data, context);
             //commented out for debug purposes
             return 23774
         }

         public void onPostExcecute(Integer res){
             result = res
         }
    }

    public void onResume(){
         super.onResume();
         MyTask mt = new MyTask();
         mt.execute(0);
         Handler h = new Handler(new Handler.Callback(){
              public void handleMessage(Message m){
                  //check result here
                  Log.i("RESULT", result);
              }
         });
         //takes 5 seks to wait
         h.sendEmptyMessageDelayed(0, 5000);
    }

}

【讨论】:

  • 谢谢......我现在明白了。我不能投票:-| (我的声誉是 8!)非常感谢 :-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多