我写了一个GetDataTask()
类,其中包含String
这是一个URL。 doInBackGround()
方法会使用StringBuilder
对象读取某些文本,并将其作为String
返回到onPostExecute()
。至少那是我认为它正在发送的地方。
在onCreate()
中,我通过使用:
new GetDataTask().execute(URL);
如何将String
中创建的GetDataTask()
恢复为onCreate()
如果需要更多代码,我可以提供。我只是认为这是执行此操作的常规标准方法,因此我没有看到需要复制一堆代码。
感谢有人看着这个。
答案 0 :(得分:2)
您的主要问题是:
如何将GetDataTask()中创建的String返回onCreate()
现在可以通过两种方式理解这一点。
String
,以便下次调用onCreate()
时您可以访问它。这可以通过以下方式完成:例如,您可以将结果存储在Bundle
中,并在调用时将其传递给onCreate()
方法。 Bundle
标准地称为savedInstanceState
,你可以这样做:
class YOUR_CLASS extends Activity { // or whatever else :)
// ...
String string_you_need = null;
// ...
class GetDataTask extends AsyncTask<URL,Void,String>{
// ...
protected Void doInBackground(URL... url) {
// ...
}
// ...
protected void onPostExecute(String result){
string_you_need = result;
}
}
// ...
将字符串保存在Bundle
:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("ID_FOR_STRING_I_NEED", string_you_need);
}
// ...
然后,当您onCreate()
被调用时,您可以使用您选择的ID访问此处存储的内容:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if( savedInstanceState != null ) {
String STORED_STRING = savedInstanceState .getString("ID_FOR_STRING_I_NEED");
}
}
您也可以使用名为SharedPreferences
的内容来达到同样的效果。
String
,以便onCreate()
之后的new GetDataTask().execute(URL);
中的下一个语句可以访问该String
。不幸的是,这不可能完成(至少不是很好),因为你使用的是 ASYNCHRONOUS 任务,这意味着我们无法与它同步,它所用的时间不能确定并提前知道异步代码不会顺序流动,它会通过触发器做出反应。这就是为什么你有onPostExecute
之类的方法在任务完成后被称为 但是什么时候任务完成未知。因此,当您获得结果时,onCreate()
可能已经完成执行。
正如@Vang建议的那样,一种方法是在没有获得数据的情况下阻止你的主线程,但这并不是非常有用,你肯定不想这样做
您仍然可以使用上面的示例立即存储结果,而不是存储以便下一次调用onCreate()
。查看string_you_need
变量。它会在您收到结果后立即存储您的结果。但是,通过这种方式可以访问您的结果 AsyncTask一旦完成,那么onCreate()
也可能在此时完成。
如果你告诉我为什么你需要将String
返回到onCreate()
并显示更多相关的代码部分,我可以给你一个建议,如何更改你的代码并仍然实现你想要的...
修改强>
您的评论:
2号听起来像我想要的。我需要String来解析它以创建将添加到ArrayList的对象。然后,我想将列表添加到Intent,并在按钮单击时将Intent发送到下一个活动。
以下是您如何实现自己想要的目标。基本上,在以单独的方法接收结果后,必须将要执行的所有代码放在一起。
首先,在活动之间发送对象的最简单方法是使它们public static
,以便两个活动都可以访问它们并使用它们。其他方法是制作对象Serializable
或Parceable
。 Here's what they are and what's the difference。
在您的活动中放置:
public static ArrayList<MyObject> myList;
然后,在您要调用的活动中,您可以访问以下内容:
YOUR_ACTIVITY.myList
向按钮添加OnClickListener
时,请确保在收到数据之前没有做任何事情。您可以使用boolean
标记来实现此目的。
boolean isDataReceived = false;
// ...
public void onClick() {
if(isDataReceived) {
// create a new intent and start your other activity
}
}
您应该创建的方法是:
void onReceiveResult(String result) {
// parse the string and store it in myList
isDataReceived = true;
}
你应该从onPostExecute()
protected void onPostExecute(String result){
onReceiveResult(result);
}
这样,只要您收到数据,就可以解析它,存储它并设置告知数据存储的标志。然后,您可以通过按钮点击调用其他活动。
注意:每次更改列表或删除列表时,请务必将isDataReceived
设置回false
。
答案 1 :(得分:1)
如果我理解正确,您需要在onCreate中返回结果。为了实现这一点,您可以使用AsyncTask中的get函数同步获取结果,但是您将阻止您的界面,而我不推荐它。
答案 2 :(得分:1)
我们可以使用其get方法
从AsyncTask获取结果new GetDataTask().execute(URL).get();
要获得结果,如果需要字符串结果
,则使asynctask任务返回类型为String答案 3 :(得分:0)
我认为你需要一个&#39; Getter&#39;函数接收&#39; String&#39;。或者您在课程中使用返回值创建的函数&#39; GetDataTask&#39;。