【问题标题】:Can't assign value to variable from doInBackground to main class无法将值分配给从 doInBackground 到主类的变量
【发布时间】:2015-08-06 00:16:18
【问题描述】:

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

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

然后我在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对象并赋值给变量:

 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");
    }

My Log in AssyncTask 按预期打印值,但在 onCreate beforeafter 值是空的?我应该如何分配这些字符串,以便我也可以从其他方法访问它们?谢谢

【问题讨论】:

    标签: java android variable-assignment


    【解决方案1】:

    AsyncTaskdoInBackground 在另一个线程上运行。

    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
        }
    
    }
    

    【讨论】:

    • @Emily 只需将Log.d("After" +itemName); 移动到onPostExecute
    • 抱歉问题格式错误,我再次编辑了它。我的意思是如何为String itemIdString 赋值并从onCreate 访问它?
    • @Emily 如果你想从onCreate 访问它,你不应该使用AsyncTask。请阅读文档和线程的整个原理。
    【解决方案2】:

    从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;
    }
    

    【讨论】:

      【解决方案3】:

      还有另一种方法是您可以检查AsyncTask 的状态,如下所示:

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

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

      【讨论】:

      • 感谢您的评论,但这并没有帮助,因为我想将变量 from AsyncTask to 分配给主线程跨度>
      • @Emily 那你为什么不使用 onPostExecute()?
      • 是答案还是问题
      • @Emily 向您提问。替我回答。
      猜你喜欢
      • 2018-03-14
      • 2022-01-03
      • 1970-01-01
      • 2022-11-23
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 2015-06-19
      相关资源
      最近更新 更多