AsyncTask中的doInBackground方法中变量未得到更新

3

我试图使用以下代码来获取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) {
    //          
  }

}

1
result 是什么?请更清楚地解释您的问题。 - Squonk
@ MisterSquonk result(int) 是一个变量。我在声明时将其初始化为任意值。在执行 doInBackground 方法(通过 this.execute() 从同一类中调用)后,结果没有改变。 - sushant kr
2
你是在什么时候检查result的值?是在onPostExecute之后还是你期望在调用AsyncTask之后立即设置result的值?别忘了AsyncTask异步的。 - Marvin Pinto
@Marvin:我已经更新了问题并附上了完整的代码。 - sushant kr
正如Marvin所指出的那样,“doInBackground(..)”是异步的。所以你创建了一个PostDataThread类的实例,然后调用startPosting(...)???如果是这样的话,那么对this.execute()的调用将会启动doInBackground(...)但立即返回。此时下一行是return result;,很可能仍然是0。这确实不是设计AsyncTask子类的好方法。 - Squonk
显示剩余2条评论
2个回答

2
< p > 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 现在明白了吗? - Marvin Pinto

2

如果结果是整数,请尝试以下操作:

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!)非常感谢 :-) - sushant kr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接