0

我想在从服务器获取响应后执行http post。 如果服务器响应为false,那么http post将执行,否则不执行。 我该怎么办。Android线程完成回调

我的Android主要活动代码:

if (Utility.isValidMobile(mobileNumber)) { 
      String isAvailable = userDelegate.checkUser(mobileNumber, context); 


      if (isAvailable.equals("false")) { 
       userDelegate.addUser(userMO, context); 
       Toast.makeText(getApplicationContext(), "Your mobile number is" + mobileNumber + "name is" + userName, Toast.LENGTH_LONG).show(); 
      } else if (isAvailable.equals("true")) { 
       Toast.makeText(getApplicationContext(), "Your mobile number is already registerd", Toast.LENGTH_LONG).show(); 
      } 
     } 

当我点击注册按钮,这上面的代码将执行

我Userdelegate类代码:

public void addUser(final UserMO userMo, final Context context) { 

    final String jsonStringObject = gson.toJson(userMo); 

    Thread t = new Thread() { 
     public void run() { 
      Looper.prepare(); // for the child Thread 
      HttpClient client = new DefaultHttpClient(); 
      HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); // Timeout 
                        // Limit 
      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("userBO", jsonStringObject)); 
       HttpPost post = new HttpPost("http://192.168.1.101:8080/warname/user/addUser"); 
       post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = client.execute(post); 
       BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
       Toast.makeText(context, "Your user id " + rd.readLine(), Toast.LENGTH_LONG).show(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      Looper.loop(); // Loop in the message queue 
     } 
    }; 
    t.start(); 

} 

public void getMatchingExistingUserList(final String mobile_number, final Context context) { 

    final String jsonStringObject = gson.toJson(mobile_number); 

    Thread t = new Thread() { 
     public void run() { 
      Looper.prepare(); // for the child Thread 
      HttpClient client = new DefaultHttpClient(); 
      HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); // Timeout 
                        // Limit 
      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("userBO", jsonStringObject)); 
       HttpPost post = new HttpPost("http://192.168.1.101:8080/warname/user/addUser"); 
       post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = client.execute(post); 
       BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
       final String responseString = rd.readLine(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      Looper.loop(); // Loop in the message queue 
     } 
    }; 
    t.start(); 
} 

public String checkUser(final String mobile_number, final Context context) { 

    final StringBuilder isAvailable = new StringBuilder(); 

    Thread t = new Thread() { 
     @Override 
     public void run() { 
      Looper.prepare(); // for the child Thread 
      try { 
       HttpClient client = new DefaultHttpClient(); 
       HttpConnectionParams.setConnectionTimeout(client.getParams(), 10000); // Timeout 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(new BasicNameValuePair("MobileNumber", gson.toJson(mobile_number))); 
       HttpPost post = new HttpPost("http://192.168.1.101:8080/warname/user/checkUserMobileNumber"); 
       post.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       HttpResponse response = client.execute(post); 
       BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
       isAvailable.append(rd.readLine()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      Looper.loop(); // Loop in the message queue 
     } 
    }; 
    t.start(); 
    return isAvailable.toString(); 
} 

问题是,我得到了回应假,但如果条件不起作用。 如何解决这个问题。

变化后:

if (Utility.isValidMobile(mobileNumber)) { 
      new AsyncTask<Void, Void, String>() { 
       @Override 
       protected String doInBackground(Void... arg0) { 
        return userDelegate.checkUser(mobileNumber, context); 
       } 

       @Override 
       protected void onPostExecute(String isAvailable) { 
        Toast.makeText(getApplicationContext(), isAvailable, Toast.LENGTH_LONG).show(); 
        if (isAvailable.equals("false")) { 
         Toast.makeText(getApplicationContext(), "Your mobile number is" + mobileNumber + "name is" + userName, Toast.LENGTH_LONG).show(); 
         userDelegate.addUser(userMO, context); 
        } else if (isAvailable.equals("true")) { 
         Toast.makeText(getApplicationContext(), "Your mobile number is already registerd", Toast.LENGTH_LONG).show(); 
        } 
       } 
      }.execute(null, null, null); 
     } 

if条件不工作?

+0

它给出了什么错误?这个'isAvailable.equals(“false”)的值是多少?' – 2015-02-06 05:31:18

+0

但isAvailable值是false。 – nmkkannan 2015-02-06 07:18:03

回答

1

如果服务器响应为false,则http post将执行else else execute。我该怎么办

问题发生是因为您正在使用checkUseraddUser中的线程。线程执行停止执行当前线程。

例如,当从主线程调用checkUser方法,然后在主线程上执行final StringBuilder isAvailable = new StringBuilder();,并且线程t正在单独执行。所以系统返回控制到下一行即return isAvailable.toString();而不等待线程执行完成意味着checkUser方法总是返回nullempty字符串。

相同的是addUser方法。

做任务根据checkUser方法响应使用AsyncTask类的结果。

+0

Thx帮助我改变它。 – nmkkannan 2015-02-06 06:34:22

+0

我想要像我的代码的例子吗? – nmkkannan 2015-02-06 06:35:19

+0

@nmkkannan:好的,做你的自我然后我一定会尽力帮你 – 2015-02-06 06:43:54

2

您在此处使用新线程执行http请求。因此,您的委托方法不同步。 addUsercheckUser将在您的http请求完成之前返回。

要编写像您这样的多线程代码,您可能需要使用某种侦听器来执行线程通信工作。

例如,你可以传递一个监听器,你的委托,看起来像这样

class Listener{ 
    private Handler handler = new Handler(); 
    public void onUserAdded(){ 
     handler.post(new Runnable(){ 
       public void run(){ 
        // Toast your thing 
       } 
     }); 
    } 

    public void onUserChecked(final boolean available){ 
     handler.post(new Runnable(){ 
       public void run(){ 
        if(available){ 
          // Toast your thing 
        }else{ 
          userDelegate.addUser(userMO, context); 
        } 
       } 
     }); 
    } 
} 

和所有new Thread(){ run(){代码应与所有呼叫监听结束。

正如您所看到的,我使用Handler将作品发回到UI线程。这对你来说非常重要,可以告诉你的UI元素你的非UI线程正在发生什么。

此外,我不明白你在做什么与你的Looper.prepare()Looper.loop()。没有子线程在那里。

+0

Thx帮助它非常有用.. – nmkkannan 2015-02-06 06:34:00