2017-07-20 72 views
0

我對開發Android應用程序相對較新。我嘗試在各處搜索答案,甚至使用OkHttp庫,但似乎沒有任何工作。如何返回一個字符串響應到我的片段形成一個API並更新我的片段

我有其顯示從在片段的API檢索的數據的應用程序。我有一個應用程序抽屜,用於更改您想要查看的內容並切換到新的片段。

我想達到什麼是連接到互聯網和檢索的所有數據,因爲它是一個字符串格式並將其分配給我的片段APIResponse字符串。

中,我有麻煩的代碼是:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_newfragment, container, false); 
    unbinder = ButterKnife.bind(this, view); 

    listdata = new ArrayList<>(); 
    DataReceivingClass dataReceivingClass; 
    String APIResponse =""; 

    APIResponse = /*Need to pass 2 String Parameters namely source and sort 
    which is required for generating the url as I want to reuse this code 
    over other fragments. 
    Connect to the internet using the url and get the data in string format 
    and assign the returned string to APIResponse */ 

    Gson gson = new Gson(); 
    dataReceivingClass = gson.fromJson(APIResponse, DataReceivingClass.class); 

    listdata = dataReceivingClass.getData(); 

我用各種解決方案,我發現的。創建新的myAsync類,該類繼承自AsyncTask並嘗試過,但仍無法完成。我的應用程序總是用來崩潰。 有一次,它沒有崩潰,它只是根據我最初傳遞給APIResponse的值工作,並沒有稍後更新它。 runOnUiThread函數似乎也很混亂,似乎沒有工作。我無法使用它。

請告訴我的代碼,使其運行。一個代碼,我可以在其他片段中重用,只需更改我的代碼中提到的參數即可。

回答

0

如果可能的話(和響應是一個JSON或XML),可以考慮使用第三方庫(如改裝或傑克遜),用於處理您的API調用,他們不執行,併爲您節省大量的時間非常困難(和問題)。

對於處理的響應,你可以使用回調時,您的請求已經結束,以「迴應」。

​​

在片段實現回調

public class YourFragment extends Fragment implements RequestCallback<String> { 
    ... your code ... 

    @Override 
    public void onSuccess(String data) { 
     // update UI 
    } 

    @Override 
    public void onError(Object error) { 
     // show error 
    } 
} 

然後你可以使用回調方法(通過分片實例)當請求已經完成。您可以在需要「響應」您的請求的每個片段/類中實現該回調。

此外,還有其他的選擇。

關於runOnUiThread,每一個網絡請求需要在獨立的線程來完成。但是你無法與該線程上的UI進行交互(我猜這就是你的應用程序崩潰的原因)。所以你使用runOnUiThread()在UI線程上執行你的代碼來與UI進行交互。

runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     // update UI 
    } 
}; 

或者,您可以在方法中使用註釋@UiThread來確保該方法在UI線程中執行。

@UiThread 
public void updateUI() { 
    // update UI 
} 

另外,如果你使用的AsyncTask您可以更新onPostExecute(),它運行在UI線程

class YourAsyncTask extends AsyncTask<String, Void, String> { 
    .. your code .. 

    @Override 
    protected void onPostExecute(String result) { 
     // update UI 
    } 
} 

我希望我已經幫助UI。

+0

它的工作感謝您的幫助。 –

相關問題