Java 如何从GetDataTask向onCreate返回字符串
我已经编写了一个Java 如何从GetDataTask向onCreate返回字符串,java,android,Java,Android,我已经编写了一个GetDataTask()类,它接受一个字符串,这是一个URL。doInBackGround()方法使用StringBuilder对象读入一些文本,并将其作为String返回给onPostExecute()。至少我认为这是它被发送的地方 在onCreate()中,我使用以下命令调用它: new GetDataTask().execute(URL); 如何将在GetDataTask()中创建的字符串返回到onCreate() 如果需要更多的代码,我可以提供。我只是觉得这是做这件
GetDataTask()
类,它接受一个字符串,这是一个URL。doInBackGround()
方法使用StringBuilder
对象读入一些文本,并将其作为String
返回给onPostExecute()
。至少我认为这是它被发送的地方
在onCreate()
中,我使用以下命令调用它:
new GetDataTask().execute(URL);
如何将在GetDataTask()
中创建的字符串
返回到onCreate()
如果需要更多的代码,我可以提供。我只是觉得这是做这件事的正常标准方式,所以我认为没有必要复制一堆代码
感谢所有看到这个的人 我认为您需要一个“Getter”函数来接收“String”。或者在“GetDataTask”类中创建一个返回值的函数。我认为您需要一个“Getter”函数来接收“String”。或者使用“GetDataTask”类中的返回值创建函数。您的主要问题是:
如何将在GetDataTask()中创建的字符串返回到onCreate()中
现在可以从两个方面来理解这一点
1) 您希望存储此字符串
,以便下次调用onCreate()
时可以访问它。这可以通过以下方式完成:
例如,您可以将结果存储在一个捆绑包中
,在调用该捆绑包时将其传递给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;
}
}
// ...
然后,当调用您的onCreate()
时,您可以使用您选择的ID访问存储在此处的内容:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if( savedInstanceState != null ) {
String STORED_STRING = savedInstanceState .getString("ID_FOR_STRING_I_NEED");
}
}
你也可以使用一些被称为相同效果的东西
2) 您希望返回此字符串
,以便onCreate()
中的下一个语句在new GetDataTask()之后执行(URL)
将有权访问该字符串
。
不幸的是,这无法做到(至少不是很好),因为您正在使用一个异步任务,这意味着我们无法与它同步,完成任务所需的时间无法确定,并且已知的异步代码没有按顺序流动,它通过触发器进行反应。这就是为什么像onPostExecute
这样的方法会在任务完成后被调用,但任务何时完成是未知的。因此,当您获得结果时,onCreate()
可能已经执行完毕
正如@Vang所建议的,一种方法是在无法获取数据时阻塞主线程,但这不是很有用,而且您肯定不想这样做
您仍然可以使用上面的示例立即存储结果,而不是为下一次调用onCreate()
存储结果。查看所需的字符串变量。它会在您收到结果后立即存储这些结果。但是,这种方式允许在AsyncTask完成后立即访问结果,因此onCreate()
也可能在那时完成
如果您告诉我为什么需要将字符串
返回到onCreate()
并显示更多相关的代码部分,也许我可以给您一个建议,告诉您如何更改代码并仍然实现您想要的功能
编辑:
您的评论:
2号听起来像我想要的。我需要对字符串进行解析,以创建将添加到ArrayList的对象。然后,我想将列表添加到意图中,并通过单击按钮将意图发送到下一个活动
以下是你如何实现你想要的。基本上,您必须在收到结果后将所有希望执行的代码放在一个单独的方法中
首先,在活动之间发送对象的最简单方法是使它们成为公共静态对象,以便两个活动都可以访问和使用它们。其他方法是制作对象或
在您的活动中放入:
public static ArrayList<MyObject> myList;
将OnClickListener
添加到按钮时,请确保在收到数据之前,它不会执行任何操作。您可以使用布尔
标志来实现这一点
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()
这样,一旦接收到数据,就可以对其进行解析、存储并设置指示数据已存储的标志。然后,您可以通过单击按钮调用其他活动
注意:每次更改或删除列表时,确保将isDataReceived
设置回false
。您的主要问题是:
如何将在GetDataTask()中创建的字符串返回到onCreate()中
现在可以从两个方面来理解这一点
1) 您希望存储此字符串
,以便下次调用onCreate()
时可以访问它。这可以通过以下方式完成:
例如,您可以将结果存储在一个捆绑包中
,在调用该捆绑包时将其传递给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;
}
}
// ...
然后,当调用您的onCreate()
时,您可以使用您选择的ID访问存储在此处的内容:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if( savedInstanceState != null ) {
String STORED_STRING = savedInstanceState .getString("ID_FOR_STRING_I_NEED");
}
}
你也可以使用一些被称为相同效果的东西
2) 您希望返回此字符串
,以便onCreate()
中的下一个语句在new GetDataTask()之后执行(URL)
将有权访问该字符串
。
不幸的是,这无法做到(至少不是很好),因为您正在使用一个异步任务,这意味着我们无法与它同步,完成任务所需的时间无法确定,并且已知的异步代码没有按顺序流动,它通过触发器进行反应。这就是为什么有像onPostExecute
这样的方法
protected void onPostExecute(String result){
onReceiveResult(result);
}
new GetDataTask().execute(URL).get();