2015-07-10 68 views
0

我正在開發一個Android應用程序,並且我試圖在登錄後從服務器獲取數據,而且無論我如何做,我都失敗了因爲很多小時。 。請讓我知道我在這裏做錯了什麼。Android:從線程中獲取服務器的數據,並將其傳遞給UI線程失敗

錯誤日誌:

07-10 15:24:09.136 4588-4588/com.example.TestLunch E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.TestLunch, PID: 4588 
    java.lang.NullPointerException: println needs a message 
      at android.util.Log.println_native(Native Method) 
      at android.util.Log.d(Log.java:139) 
      at com.example.TestLunch.Login.Login$3.onClick(Login.java:104) 

上面來,因爲我想從打印服務器的應答。

public class Login extends Activity { 

     RestTemplate rest = StaticRestTemplate.getRest(); 
    protected volatile String reply; 

// below code is inside the onCreate method 

    Button loginButton = (Button) findViewById(R.id.LoginButton); 
      loginButton.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (!(v == null)) { 
         EditText userEmail = (EditText) findViewById(R.id.usernameText); 
         EditText userPassword = (EditText) findViewById(R.id.PasswordField); 
         if (!(userEmail.getText().toString().isEmpty())) { 
          if (!(userPassword.getText().toString().isEmpty())) { 
           loginUserViaRest(userEmail.getText().toString(), userPassword.getText().toString()); 
           Thread thread = new Thread(new Runnable() { 
            @Override 
            public void run() { 
             reply = rest.getForObject(
               "http://192.168.178.60:8080/dashboard", String.class); 

            } 
           }); 
           thread.start(); 
           ProgressDialog progress = new ProgressDialog(Login.this); 
           progress.setTitle("Loading"); 
           progress.setMessage("Wait while loading..."); 
           progress.show(); 
           while (thread.getState()!=Thread.State.TERMINATED){ 

           } 
           progress.dismiss(); 
    // I get the error at below line. 
           Log.d("Reply is ",reply); 

那麼,什麼錯誤。任何指針,謝謝。

+0

我不知道爲什麼你正在使用Thread類,使用的AsyncTask –

+0

@mohammadsadeghsaati:如果它是異步任務,我不會在將來的某個點上獲取我的數據,我該如何檢查它。可以給我寫一個符合要求的答案,我會平行檢查它。 –

回答

1

使用AsyncRestTemplate代替RestTemplate,使用getForEntity方法,並附加ListenableFutureCallback它像;

rest.getForEntity(...).addCallback(...); 
+0

This工作,謝謝.... :-) –

+0

爲什麼你編輯你的代碼,之前工作。 –

+0

我不確定我的示例作品,因爲我從腦海中寫下了這些作品。 :) – Hyperion

1

這很簡單。您的答覆字符串爲空,您不會從服務器獲得答覆。 檢查您的許可,在你的清單,並檢查您是否已經添加

<uses-permission android:name="android.permission.INTERNET" /> 

或不

+0

是的,我明白了。我在發送之前將其打印在服務器端,所以我知道它在那裏。此外,我知道答覆是空的,這就是我想了解爲什麼會發生,即使我發送它。 –

+0

如果您檢查了http://192.168.178.60:8080/dashboard是否有回覆,那麼休息對象有問題,您應該檢查它 – HendraWD

+0

並始終記住如果您使用GET方法url發送字符進行發送 – HendraWD

1

那是因爲你使用一個線程進行分配變量,得到的答覆一直沒有得到一個值,當你調用

Log.d("Reply is ",reply);