调用函数发布到服务器并根据响应执行任务

时间:2013-06-15 23:04:15

标签: php android multithreading post

我正在开发android / php项目。我正在创建一个用于android的库,用户调用初始化函数,我将该函数传递给ID。

然后该函数应该向我的服务器发送HTTP帖子,在那里它检查我的数据库是否存在该ID。根据服务器的响应,我需要设置初始化完成,或者记录错误,说初始化无法完成。

但是,因为我需要在一个线程中运行帖子,所以我的代码直接下降到下一行代码,这意味着初始化失败了。那么如何在线程完成之前暂停代码执行。

以下是初始化功能。

public static void Initialise(Context context, String appID)
    {
        appContext = context;
        CritiMon.appID = appID;
        isAppIdCorrect(appID);
        if (appIdValid)
        {
            isInitialised = true;
        }
        else
        {
            Log.e("CritiMon Initialisation", "Incorrect App ID was detected. Please check that you have entered the correct app ID. The app ID can be found on the web pages");
        }
    }

以下是isAppIdCorrect功能

private static void isAppIdCorrect(String appID)
    {

        new Thread(new Runnable() {

            @Override
            public void run() {

                try
                {
                    HttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(appContext.getString(R.string.post_url) + "/AccountManagement.php");

                    List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
                    nameValuePairs.add(new BasicNameValuePair("type", "checkAppId"));
                    nameValuePairs.add(new BasicNameValuePair("appID", CritiMon.appID));

                    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));

                    HttpResponse response = httpClient.execute(httpPost);
                    InputStream is = response.getEntity().getContent();
                    BufferedInputStream bis = new BufferedInputStream(is);
                    ByteArrayBuffer baf = new ByteArrayBuffer(20);

                    int current = 0;
                    while ((current = bis.read()) != -1)
                    {
                        baf.append((byte)current);
                    }

                    Log.d("Http Response", new String(baf.toByteArray()));

                    String httpResponse = new String(baf.toByteArray());

                    if (httpResponse.equals("200 OK"))
                    {
                        appIdValid = true;
                    }
                    else
                    {
                        appIdValid = false;
                    }

                }
                catch (ClientProtocolException ex)
                {
                    Log.e("ClientProtocolException", ex.toString());
                }
                catch (IOException ex)
                {
                    Log.e("IOException", ex.toString());
                }
                appIdCheckComplete = true;
            }
        }).start();
    }

所以在上面的代码中,isAppIdCorrect函数按预期返回200 OK,但由于该函数在一个线程中,它在线程完成之前立即转到if语句,所以if声明是错误的,因此说初始化失败了。

我如何等待线程完成,以便检查变量。

感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

将async模型与起始线程一起使用并设置某种onCompleteListener并在触发之前不执行任何操作。看一下AsyncTask课程。