Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从GetDataTask向onCreate返回字符串_Java_Android - Fatal编程技术网

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();