无法将值从doInBackground赋给变量到主类

时间:2015-05-24 10:54:09

标签: java android variable-assignment

我有一个android类,我初始化我的变量:

public class myClass extends Activity {
String itemIdString;
...
}

然后我在AssyncTask方法

中调用onCreate
protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.next_item_caller);

            Log.d("Before " +itemName);
            new getItemNumber().execute();
            Log.d("After" +itemName);
            ...
     return "success";
    }

AssyncTask中,我解析JSON对象并为变量赋值:

 class getItemNumber extends AsyncTask<String, String, String> {
    protected void onPreExecute() {
        super.onPreExecute();
        Log.d("getItemNumber", "On pre-execute");
    }

protected String doInBackground(String... args) {
//parse here
itemIdString = c.getString(TAG_ITEM_ID);
Log.d(TAG, itemIdString);
}
 protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.d("getItemNumber", "on Post-Execute");
    }

我的登录AssyncTask按照预期的值打印值,但在之前的onCreate 值之后的是否为空?我应该如何分配这些字符串,以便我也可以从其他方法访问它们?谢谢

3 个答案:

答案 0 :(得分:2)

AsyncTask的{​​{1}}在另一个主题上运行。

doInBackground在UI线程上运行。

因此,当您致电onCreate时,您不会等待它完成并继续您的下一行

AsyncTask.execute()

要在 Log.d("After" +itemName); 完成后检测,您有一个方便的回调方法doInBackground

onPostExecute

答案 1 :(得分:1)

从doInBackgroind方法返回字符串值,然后将其分配给在主线程上运行的onPostExecute方法中的itemIdString

class getItemNumber extends AsyncTask<String, String, String> {
    protected void onPreExecute() {
        super.onPreExecute();
        Log.d("getItemNumber", "On pre-execute");
    }

protected String doInBackground(String... args) {
    //parse here
    return c.getString(TAG_ITEM_ID);
}

 protected void onPostExecute(String result) 
   super.onPostExecute(result);
    //assign itemIdString here
   itemIdString = result;
}

答案 2 :(得分:0)

另一种方法是,您可以按如下方式检查AsyncTask的状态:

onCreate()中,你可以像这样检查AysncTask的状态:

MyAsyncTask myAsyncTask = new MyAsyncTask();
myAsyncTask.execute();

if(myAsyncTask.getStatus() == AsyncTask.Status.FINISHED){
        // MyAsyncTask completed. assign your variable now    
}