制作应用程序真正的异步(Android)

时间:2017-05-29 16:14:04

标签: android android-asynctask android-recyclerview

我正在构建一个非常依赖异步请求来运行的应用程序。 我有一个名为MainActivity的主Activity。除了包含布局之外,这确实没什么用,但它确实有一个recycleviewer。 然后我有几个http请求来填充回收查看器。

为此,我编写了一个java类,如下所示:

public class dataforUi extends AsyncTask<String, String, JsonObject> {
    private ArrayList<UiElements> els;


    protected void onPreExecute() {
        progressDialog.setMessage("Downloading your data...");
        progressDialog.show();
        progressDialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
            public void onCancel(DialogInterface arg0) {
                RedditRequests.this.cancel(true);
            }
        });
    }



    protected JsonObject doInBackground(String... params) {
Do the http request here, get the result and populate uiElements with it
}

 @Override
    protected void onPostExecute(JsonObject jsonObject) {
        super.onPostExecute(jsonObject);
        progressDialog.hide();

    }

我还有更多这样的课程,但希望它可以作为我尝试做的一个例子。

然后回到主要活动,我有这个代码:

public void getUiElements() {
        dataforUi ui = new dataforUi(findViewById(android.R.id.content));
        try {
            ui.execute("https://t").get();
            ArrayList<UiElements> r = ui.getEls();
            Log.d("MainFeedScreen", "Size of r is:" + r.size());
            UiAdapter = new UiAdapter(r);
            mRecyclerView.setAdapter(UiAdapter);
        } catch (Exception e) {

        }
    }

这样可以正常工作,但由于在执行时使用.get()来阻止它,因此非常容易。如果我删除了.get(),进度条会在任务完成时显示并消失,但是我的ui线程已经过了这个并且ha试图用空数组填充我的视图,因此没有任何显示。

我已经做了一些调查,但无法找到管理UI线程通知活动完成的确定方法。

真的会对这个问题提出任何建议。

2 个答案:

答案 0 :(得分:0)

您需要修复您的设计。

在执行后,使用本地广播通知您的MainActivity AsyncTask已完成。

答案 1 :(得分:0)

尝试使用单独的线程来处理您的数据。我使用ListView代替RecyclerView,但原理是一样的。

我对查看视图没有任何问题。

protected void onPostExecute(String result) {
    final String value = result;
    // dismiss the dialog after getting all data
    progressDialog.dismiss();

    if (!value.isEmpty()) {

        // updating UI from a new thread
        runOnUiThread(new Runnable() {
            public void run() {

                // ListData is my custom class that holds my data
                ArrayList<ListData> arrayDriverListData = new ArrayList<ListData>();
                ListDataAdapter adapter = new ListDataAdapter(ListActivity.this, arrayListData);
                ListData data;
                boolean b = true;

                try {
                    // My data is from a Json source from node 'history'
                    JSONObject object = new JSONObject(value);
                    JSONArray array = object.getJSONArray("history");

                    int len = array.length();
                    if (len > 0) {
                        for (int i = 0; i < len; i++) {
                            final JSONObject o = array.getJSONObject(i);
                            // Parse my data and add it to my adapter
                            adapter.add(data);
                        }
                    }
                } catch (JSONException jex) {
                    Log.e(TAG, "" + jex.getMessage());
                }
                // setListAdapter is my call to update my list view
                setListAdapter(adapter);
            }
        });
    }
}

现在只需更新UI线程

private void setListAdapter(ListDataAdapter adapter){
    // my ListView 
    lvHistory.setAdapter(adapter);
}