Java Can';t为变量赋值,从doInBackground到main类

Java Can';t为变量赋值,从doInBackground到main类,java,android,variable-assignment,Java,Android,Variable Assignment,我有一个android类,我在其中初始化变量: public class myClass extends Activity { String itemIdString; ... } class getItemNumber extends AsyncTask<String, String, String> { protected void onPreExecute() { super.onPreExecute(); Log.d("getIte

我有一个android类,我在其中初始化变量:

public class myClass extends Activity {
String 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
itemIdString = c.getString(TAG_ITEM_ID);
Log.d(TAG, itemIdString);
}
 protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.d("getItemNumber", "on Post-Execute");
    }
然后在我的
onCreate
方法中调用
AssyncTask

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对象并为变量赋值:

public class myClass extends Activity {
String 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
itemIdString = c.getString(TAG_ITEM_ID);
Log.d(TAG, itemIdString);
}
 protected void onPostExecute(String result) {
        super.onPostExecute(result);
        Log.d("getItemNumber", "on Post-Execute");
    }
类getItemNumber扩展了异步任务{
受保护的void onPreExecute(){
super.onPreExecute();
Log.d(“getItemNumber”,“预执行时”);
}
受保护的字符串doInBackground(字符串…args){
//在这里解析
itemIdString=c.getString(TAG\u ITEM\u ID);
Log.d(标记,itemiString);
}
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
Log.d(“getItemNumber”,“在执行后”);
}

我登录的
AssyncTask
按预期打印值,但在
onCreate
中前后的值为空?我应该如何分配这些字符串,以便我也可以从其他方法访问它们?感谢
AsyncTask
doInBackground
在另一个线程上运行

onCreate
在UI线程上运行

因此,当您调用
AsyncTask.execute()
时,您不必等待它完成并继续下一行,即

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

private class MyTask extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        // doInBackground finished, use your variable now
    }

}
私有类MyTask扩展了AsyncTask{
@凌驾
受保护的Void doInBackground(Void…参数){
返回null;
}
@凌驾
受保护的void onPostExecute(void避免){
super.onPostExecute(避免);
//完成后台工作后,立即使用变量
}
}

另一种方法是,您可以检查
异步任务的状态,如下所示:

onCreate()
中,您可以检查AYSNTASK的状态,如下所示:

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

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

从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;
}
类getItemNumber扩展了异步任务{
受保护的void onPreExecute(){
super.onPreExecute();
Log.d(“getItemNumber”,“预执行时”);
}
受保护的字符串doInBackground(字符串…args){
//在这里解析
返回c.getString(标记\项目\ ID);
}
受保护的void onPostExecute(字符串结果)
super.onPostExecute(结果);
//在此处分配itemIdString
itemIdString=结果;
}

@Emily刚刚移动
Log.d(“在”+itemName之后)
onPostExecute
。很抱歉问题格式不正确,我再次编辑了它。我的意思是,我如何为
字符串itemString
赋值并从
onCreate
访问它?@Emily如果你想从
onCreate
访问它,你不应该使用
异步任务
。请阅读文档谢谢你的评论,但是它没有帮助,因为我想把变量从
AsyncTask
分配给mainthread@Emily那么为什么不使用onPostExecute()?这是答案还是答案quesiton@Emily问你问题,回答我。