从服务器获取数据,并加载使用Android

从服务器获取数据,并加载使用Android

问题描述:

我使用下面的代码从服务器获取数据,如果从服务器值GEEK那么它会自动装载到下一节课,但新视图没有加载新的屏幕。你能说出什么问题吗?从服务器获取数据,并加载使用Android

 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     login = (Button) findViewById(R.id.login); 
     username = (EditText) findViewById(R.id.username); 
     password = (EditText) findViewById(R.id.password); 

     login.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
String Re; 
       String mUsername = username.getText().toString(); 
       String mPassword = password.getText().toString(); 

       Re=tryLogin(mUsername, mPassword); 

       if(Re=="GEEK") 
       { 
        Intent i = new Intent(); 
        i.setClassName(v.getContext(),"com.httplogin.MainScreen"); 
        startActivity(i); 

       } 
      } 
     }); 
    } 

    protected String tryLogin(String mUsername, String mPassword) 
    {   
     HttpURLConnection connection; 
     OutputStreamWriter request = null; 

      URL url = null; 
      String response = null;   
      String parameters = "username="+mUsername+"&password="+mPassword; 

      try 
      { 
       url = new URL("http://serverspace/script.php"); 
       connection = (HttpURLConnection) url.openConnection(); 
       connection.setDoOutput(true); 
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       connection.setRequestMethod("POST");  

       request = new OutputStreamWriter(connection.getOutputStream()); 
       request.write(parameters); 
       request.flush(); 
       request.close();    
       String line = "";    
       InputStreamReader isr = new InputStreamReader(connection.getInputStream()); 
       BufferedReader reader = new BufferedReader(isr); 
       StringBuilder sb = new StringBuilder(); 
       while ((line = reader.readLine()) != null) 
       { 
        sb.append(line + "\n"); 
       } 
       // Response from server after login process will be stored in response variable.     
       response = sb.toString(); 

       isr.close(); 
       reader.close(); 


      } 
      catch(IOException e) 
      { 
       Toast.makeText(this,e.toString(),0).show(); 
      } 
      return response; 
    } 
} 

请参阅本代码..............,使用微调功能,因为它消除了字符串中的空间..

public class HttpLogin extends Activity { 
    /** Called when the activity is first created. */ 
    private Button login; 
    private EditText username, password; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     login = (Button) findViewById(R.id.login); 
     username = (EditText) findViewById(R.id.username); 
     password = (EditText) findViewById(R.id.password); 

     login.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
      String Re; 
       String mUsername = username.getText().toString(); 
       String mPassword = password.getText().toString(); 

       Re=tryLogin(mUsername, mPassword); 
       Log.d(" Check ","Here"); 
       Log.d("Re",Re); 
       String temp_check=Re.trim(); 
       if(temp_check.equals("GEEK")) 
       { 
        Intent i = new Intent(); 
        i.setClassName(v.getContext(),"com.httplogin.MainScreen"); 
        startActivity(i); 

       } 
       else 
       { 
       //Toast.makeText(HttpLogin.this,"MAX Returned",0).show(); 
       displayAlert(Re); 
//     Intent i = new Intent(); 
//      i.setClassName(v.getContext(),"com.san.MainScreen"); 
//      startActivity(i); 
       } 
      } 
     }); 
    } 

    protected String tryLogin(String mUsername, String mPassword) 
    {   
     Log.d(" TryLoginCheck ","Here"); 
     HttpURLConnection connection; 
     OutputStreamWriter request = null; 

      URL url = null; 
      String response = null; 
      String temp=null; 
      String parameters = "username="+mUsername+"&password="+mPassword; 
      System.out.println("UserName"+mUsername+"\n"+"password"+mPassword); 
      Log.d("Parameters",parameters); 
      try 
      { 

       url = new URL("http://serverspace/script.php"); 
       connection = (HttpURLConnection) url.openConnection(); 
       connection.setDoOutput(true); 
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       connection.setRequestMethod("POST");  

       request = new OutputStreamWriter(connection.getOutputStream()); 
       request.write(parameters); 
       request.flush(); 
       request.close();    
       String line = "";    
       InputStreamReader isr = new InputStreamReader(connection.getInputStream()); 
       BufferedReader reader = new BufferedReader(isr); 
       StringBuilder sb = new StringBuilder(); 
       while ((line = reader.readLine()) != null) 
       { 

        sb.append(line + "\n"); 
       } 
       temp=sb.toString(); 
       Log.d("Temp",temp); 
       // Response from server after login process will be stored in response variable.     
       response = sb.toString(); 
       Log.d("Response",response); 
       Log.d("Sb Value",sb.toString()); 
       isr.close(); 
       reader.close(); 


      } 
      catch(IOException e) 
      { 
       Toast.makeText(this,e.toString(),0).show(); 
      } 
      // Log.d("Response",response); 
      return response; 
    } 
    public void displayAlert(String Re) 
    { 
    new AlertDialog.Builder(this).setMessage(Re) 
     .setTitle("Returned Value") 
     .setCancelable(true) 
     .setNeutralButton(android.R.string.ok, new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog, int whichButton){ 
      finish(); 
      } 
      }) 
     .show(); 
    } 
} 

是否区分大小写?在比较大小写无关紧要的字符串和.equals()时,您应该使用.equalsIgnoreCase()。你是否也已经通过了这个调试,以确保tryLogin(mUsername, mPassword)正在返回预期值?

+0

可以添加代码片段吗? – 2010-12-20 07:04:50

+0

如果(Re.equals( “奇客”)){...}了解更多当前位置 - > http://developer.android.com/reference/java/lang/String.html – ninjasense 2010-12-20 07:07:16

一个需要注意你的代码中的重要的事情是,你不应该从UI线程中运行较长时间的操作,例如(在你的情况tryLogin()调用)远程服务器访问。这种编程将导致您的应用程序中的ANR。有关此主题的更多信息,请阅读this article

简而言之,而不是从的onCreate调用tryLogin,创建异步任务

new LoginTask().execute(mUsername, mPassword); 

登录任务应该被定义是这样的:

private class LoginTask extends AsyncTask<string, void,="" String=""> { 
    protected String doInBackground(String... login) { 
     return tryLogin((login[0],login[1]); 
    } 

    protected void onPostExecute(String result) { 
     if(result.equalsIgnoreCase("GEEK")) 
     { 
      Intent i = new Intent(); 
      i.setClassName(v.getContext(),"com.httplogin.MainScreen"); 
      startActivity(i); 
     } 
    } 
} 
+0

我应该怎么办???? – 2010-12-20 09:07:32

+0

查看我的答案上面添加的示例。 – dstefanox 2010-12-20 10:47:00