Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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
Android 使用AsyncTask从服务器获取数据_Android_Android Asynctask - Fatal编程技术网

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) {

    }
});