Android 使用AsyncTask从服务器获取数据
在我的程序中,许多值存储在服务器上。 我使用Android 使用AsyncTask从服务器获取数据,android,android-asynctask,Android,Android Asynctask,在我的程序中,许多值存储在服务器上。 我使用AsyncTask类从服务器读取这些数据 这是我的代码: public class TestActivity extends AppCompatActivity { private static List<String> mPackName; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.
AsyncTask
类从服务器读取这些数据
这是我的代码:
public class TestActivity extends AppCompatActivity {
private static List<String> mPackName;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPackName = new ArrayList<>();
try {
boolean check = new GetDataAsyncTask().execute("1234567").get();
} catch (InterruptedException e) {
} catch (ExecutionException e) {
e.printStackTrace();
e.printStackTrace();
}
}
private class GetDataAsyncTask extends AsyncTask<String, Void, Boolean> {
@Override
protected Boolean doInBackground(String... params) {
final String mCode = params[0];
APIGettingPosts apiGettingPosts = new APIGettingPosts(TestActivity.this, "get_off_code.php");
apiGettingPosts.getOffCode(new APIGettingPosts.OnOffCodeReceived() {
@Override
public void onReceived(List<Posts> posts) {
if (!(posts == null || posts.isEmpty()))
for (int i = 0; i < posts.size(); ++i) {
mPackName.add(posts.get(i).getTitle());
Log.e("mPackName["+String.valueOf(i)+"]",mPackName.get(i));
}
}
});
Log.e("Size of mPackName: ", String.valueOf(mPackName.size()));
for (int i = 0; i < mPackName.size(); ++i)
if (mCode.equals(mPackName.get(i))) {
Log.e("Is Equal: ", mPackName.get(i));
return true;
}
return false;
}
}
}
公共类测试活动扩展了AppCompative活动{
私有静态列表mPackName;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mPackName=newarraylist();
试一试{
布尔检查=新建GetDataAsyncTask().execute(“1234567”).get();
}捕捉(中断异常e){
}捕获(执行例外){
e、 printStackTrace();
e、 printStackTrace();
}
}
私有类GetDataAsyncTask扩展了AsyncTask{
@凌驾
受保护的布尔doInBackground(字符串…参数){
最终字符串mCode=params[0];
apightingposts-apightingposts=newapightingposts(TestActivity.this,“get_off_code.php”);
ApightingPosts.getOffCode(新的ApightingPosts.OnOffCodeReceived(){
@凌驾
已收到的公开职位(列出职位){
if(!(posts==null | | posts.isEmpty())
对于(int i=0;i
程序正确地从服务器接收数据并将其存储在mPackName
列表中。在doInBackground
函数的末尾,程序检查GetDataAsyncTask().execute(“1234567”)
函数中的输入值是否存在于mPackName
列表中,返回true
值
尽管GetDataAsyncTask().execute(“1234567”)
函数的输入值在mPackName
列表中,但程序返回false
值
Log cat
输出如下:
08-28/com.green E/mPackName的大小::0
08-28/com.green E/mPackName[0]:1234567
08-28/com.green E/mPackName[1]:QAZXSWE
08-28/com.green E/mPackName[2]:QWERTYU
mPackName
列表的大小在Log cat
中也为零,尽管它有三个值{'1234567','QAZXSWE','QWERTYU'}
问题是:如何在mPackName
列表中搜索“1234567”值,以返回check=new GetDataAsyncTask()中的true
值。执行(“1234567”).get()代码>
编码?尝试在onPostExecute()方法中放置一个开关
例如
。。。
私有类GetDataAsyncTask扩展了AsyncTask{
@凌驾
void onPostExecute(对象o){
HandlerResults()
}
...
无效HandlerResults(){
//在这里插入您的支票
}
尝试在onPostExecute()方法中放置一个开关
例如
。。。
私有类GetDataAsyncTask扩展了AsyncTask{
@凌驾
void onPostExecute(对象o){
HandlerResults()
}
...
无效HandlerResults(){
//在这里插入您的支票
}
编辑答案
看起来您甚至不需要AsyncTask
,因为getOffCode
方法已在后台线程中运行
删除GetDataAsyncTask
类并创建如下方法
private void search(final SearchCallback callback) {
APIGettingPosts apiGettingPosts = new APIGettingPosts(TestActivity.this, "get_off_code.php");
apiGettingPosts.getOffCode(new APIGettingPosts.OnOffCodeReceived() {
@Override
public void onReceived(List<Posts> posts) {
if (!(posts == null || posts.isEmpty())) {
for (int i = 0; i < posts.size(); ++i) {
mPackName.add(posts.get(i).getTitle());
Log.e("mPackName[" + String.valueOf(i) + "]", mPackName.get(i));
if (mCode.equals(mPackName.get(i))) {
callback.onSearchFound(true);
break;
}
}
}
callback.onSearchFound(false);
}
});
}
public interface SearchCallback{
void onSearchFound(boolean success);
}
编辑答案
看起来您甚至不需要AsyncTask
,因为getOffCode
方法已在后台线程中运行
删除GetDataAsyncTask
类并创建如下方法
private void search(final SearchCallback callback) {
APIGettingPosts apiGettingPosts = new APIGettingPosts(TestActivity.this, "get_off_code.php");
apiGettingPosts.getOffCode(new APIGettingPosts.OnOffCodeReceived() {
@Override
public void onReceived(List<Posts> posts) {
if (!(posts == null || posts.isEmpty())) {
for (int i = 0; i < posts.size(); ++i) {
mPackName.add(posts.get(i).getTitle());
Log.e("mPackName[" + String.valueOf(i) + "]", mPackName.get(i));
if (mCode.equals(mPackName.get(i))) {
callback.onSearchFound(true);
break;
}
}
}
callback.onSearchFound(false);
}
});
}
public interface SearchCallback{
void onSearchFound(boolean success);
}
我认为在doInBackground方法中,程序不是线性编译的。因为在doInBackground方法中,我们正在等待来自服务器的数据。首先看到列表的0大小,程序等待从服务器调用整个数据。是和否…是的,doInBackground确实在后台线程上运行,但我猜是APIGettingPosts ApightingPosts=新的ApightingPosts(…)也在单独的后台线程上运行。因此,您的日志语句在调用onReceived之前执行。我认为在doInBackground方法中,程序不是线性编译的。因为在doInBackground方法中,我们正在等待来自服务器的数据。首先会看到列表的0大小,程序会等待整个过程要从服务器调用的数据。是和否…是doInBackground确实在后台线程上运行,但我猜ApightingPosts ApightingPosts=new ApightingPosts(…)也在单独的后台线程上运行。因此,您的日志语句在调用onReceived之前执行。在execute方法完成后调用OnPost execute。如果此操作不起作用,则会出现其他问题。您可以查看这篇精彩的文章,它解释了如何从AsyncTask PropertyOnP获取信息ost execute是在execute方法完成后调用的。如果此方法不起作用,则可能存在其他错误。您可以查看这篇精彩的文章,它解释了如何正确地从AsyncTask中获取信息@Krishna。您太棒了。@Saeed谢谢!!非常感谢@Krishna。您太棒了。@Saeed谢谢!!
search(new SearchCallback(){
@Override
public void onSearchFound(boolean success) {
}
});