2016-07-26 38 views
0

我搜索了類似的問題,但很遺憾,我發現它們非常混亂,而且在使用Android和Retrofit方面我還是一個新手。Android Retrofit 1.9成功返回ListString

我這裏有一個聯繫人列表JSON

http://api.androidhive.info/contacts/ 

而且已經工作列表,但後來我想處理改造過程到另一個類這樣我就可以把它叫做每當我想要的。我有MainActivity調用UI和處理成功和失敗方法的RetrofitHandler。

這是我的主要活動

public class MainActivity extends AppCompatActivity{ 

//note i just simplifiend my code a little 

private List<Contacts> contacts; 
public String[] itemer; 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    RetrofitHandler retrofitHandler = new RetrofitHandler(); 

    itemer = retrofitHandler.getContacts(this); 

    if (itemer != null) { 
     Toast.makeText(MainActivity.this,itemer[0],Toast.LENGTH_SHORT).show(); 

    } 

} 

這裏是我的HandlerClass

ublic class RetrofitHandler { 
public String[] item; 
public static final String ROOT_URL = "http://api.androidhive.info"; 
public List<Contacts> contacts; 

public String[] getContacts(final Context context) { 
    final ProgressDialog loading = ProgressDialog.show(context, "Fetching Data", "Please wait...", false, false); 

    RestAdapter adapter = new RestAdapter.Builder().setEndpoint(ROOT_URL).build(); 
    ContactsAPI api = adapter.create(ContactsAPI.class); 

    api.getContacts(new Callback<Contacts>() { 
     @Override 
     public void success(Contacts contacts, Response response) { 
      loading.dismiss(); 
      MainActivity update = new MainActivity(); 
      List<Contact> contactList = contacts.getContacts(); 


      item = new String[contactList.size()]; 

      for (int i = 0; i < contactList.size(); i++) { 

       item[i] = contactList.get(i).getName(); 
      } 

     } 

     @Override 
     public void failure(RetrofitError error) { 
      Toast.makeText(context, "Error Occured", Toast.LENGTH_LONG).show(); 
     } 

    }); 
    return item; 
} 

我的問題是,它與logcat的沒有錯誤順利進行。不幸的是,敬酒的主要活動將不會出現。

+0

是一個網絡調用,可能會出現主線程和後臺線程問題, 那麼,爲什麼你不能從成功功能的結束祝酒。 另外,檢查你收到的回覆是否爲空 –

+0

@mohitsharma好的成功敬酒是我完成的,但最初我想把從主要活動的listview可能項目成功的項目不是null我測試它用烤麪包 – user3262438

+0

嘗試檢查:如果您的條件正在執行或沒有, 嘗試將println放入if block中並將條件更改爲itemer.length/size –

回答

0

您的問題是由於請求/響應的異步性質。成功或失敗回調觸發響應,這是以異步方式發生的。所以基本上您的方法返回之前,發生,這意味着您的項目爲空。您必須使用同步機制,或者您必須檢查MVP pattern哪個爲您的問題提供了完美的解決方案。見下面是使用同步調用的例子(我沒有測試過,但它應該可以工作)。

public List<Contacts> getContacts(){ 
    RestAdapter adapter = new RestAdapter.Builder().setEndpoint(ROOT_URL).build(); 
    ContactsAPI api = adapter.create(ContactsAPI.class); 
    return api.getContacts(); 
} 

看到這個tutorial得到更多的想法。我建議你搬到改造2,這比改造1要大得多。