Java Can';t为变量赋值,从doInBackground到main类
我有一个android类,我在其中初始化变量: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
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问你问题,回答我。