如何从我的片段返回字符串响应形式API并更新我的片段

时间:2017-07-20 16:38:24

标签: android android-fragments

我对开发Android应用程序比较陌生。我试着在任何地方寻找答案,即使使用OkHttp库,但似乎没有任何工作。

我有一个应用程序,它显示从片段中的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函数似乎也很混乱,似乎没有用。我无法使用它。

请告诉我使其运行的代码。我可以通过改变我的代码中提到的参数来重用其他片段中的代码,我们将非常感激。

1 个答案:

答案 0 :(得分:0)

如果可能(并且响应是Json或XML),考虑使用第三方库(如Retrofit或Jackson)来处理API调用,它们实现起来并不是很困难,并且可以节省大量时间(以及问题)。

为了处理响应,您可以在请求结束时使用Callbacks“响应”。

public interface RequestCallback<T> {
   void onSuccess(T data);

   void onError(Object error);
}

在片段中实施回调

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
    }
}

然后,您可以在请求完成时使用Callback方法(传递Fragment实例)。您可以在需要“响应”您的请求的每个片段/类中实现该回调。

此外,还有其他选择。

关于runOnUiThread,每个网络请求都需要在一个单独的线程中完成。但是你无法与该线程上的UI进行交互(我想这就是你的应用程序崩溃的原因)。因此,您使用runOnUiThread()在UI Thread上执行代码以与UI进行交互。

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

或者,您可以在方法中使用Annotation @UiThread来确保在UI线程中执行该方法。

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

此外,如果你正在使用AsyncTask,你可以在onPostExecute()上更新UI,它在UI线程上运行

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

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

我希望我有所帮助。