java - 是使用线程从服务器获取数据并更新 ListView 的正确方法

标签 java android multithreading

我是新的 android 并找到了更新 UI 上的数据的最佳方法,并具有线程安全性以从服务器获取数据。 这是我从服务器 api 获取数据并更新 ListView 的代码, 但我认为这种方法可能会导致应用程序的性能下降。
我正在使用 okhttp 来调用服务器 api。

public String ActionAsyncGetTeamData(final String URL, final String token,final String expected_closure_date, final HTTPVerb verb, Activity activity) {
    final String[] ResponseData = new String[1];
    loading_complete=false;
    _context = activity;

    if (networkDetector.isNetworkAvailable()) {
        new Thread(new Runnable() {
            public void run() {

                ResponseData[0] = GET(URL, token, expected_closure_date);
                leadList.clear();
                meetingList.clear();
                taskList.clear();

                TeamSyncModel teamSyncModel=json.fromJson(ResponseData[0],TeamSyncModel.class);
                for (LeadModel leadModel: teamSyncModel.lead) {
                    leadList.add(leadModel);
                }
                for (MeetingModel meetingModel: teamSyncModel.meeting) {
                    meetingList.add(meetingModel);
                }
                for (TaskModel taskModel: teamSyncModel.task) {
                    taskList.add(taskModel);
                }
                loading_complete=true;

                _context.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Planner planner=new Planner();
                        planner.progress.setVisibility(View.GONE);
                        planner.list.setVisibility(View.VISIBLE);
                        planner.adapterTeam(_context);
                        planner.closure_header.requestFocus();
                    }
                });


            }
        }).start();
        return ResponseData[0];
    }
    else {
        Planner planner=new Planner();
        planner.progress.setVisibility(View.GONE);
        planner.list.setVisibility(View.VISIBLE);
        planner.adapterTeam(_context);
        leadList.clear();
        meetingList.clear();
        taskList.clear();
        loading_complete=true;
        Toast.makeText(_context.getApplicationContext(), "Internet connection not available", Toast.LENGTH_SHORT).show();
    }
    return null;
}

从服务器获取数据

private String GET(String url, String token, String lastSync) {
    client.setConnectTimeout(15, TimeUnit.MINUTES);
    client.setReadTimeout(15, TimeUnit.MINUTES);
    try {
        Request request = new Request.Builder()
                .url(url + lastSync)
                .addHeader("x-access-token", token)
                .build();
        Response response = client.newCall(request).execute();
        return response.body().string();
    } catch(Exception ex) {
        ex.printStackTrace();
    }
    return null;
}

在 android 中执行此任务的正确方法

最佳答案

您尝试以下步骤

1 in UI create refer to listview, adapter and asyntask
2 from the ui send reference to adapter at the asyntask in this getData from server and in the method onPostExecute of the asynk call this method adapter.notifyDatasetChange();
3 in the adapter you manage the info what you give of the server in the asyntask 

关于java - 是使用线程从服务器获取数据并更新 ListView 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33418646/

相关文章:

java - Java Spring Boot:Servlet [dispatcherServlet]的Servlet.service()抛出异常

android - 为不同屏幕密度转换布局 dpi 的工具

java - 响应 409,共享首选项管理器

Activity 有动画时的Android单元测试

java - JVM 上具有多个线程的进程是否会比具有一个线程的进程拥有更多的 cpu 时间?

java - 如何在 Nodejs 中使用像 RMI 这样的 Java Spring Service?有人知道吗?

java - 使用 JFrame 进行边框布局

JavaFX 隐藏表单然后立即再次显示

c++ - 如何在多线程 C++ 17 程序中交换两个指针?

java - 如何将您的程序与对 "bad"API 的调用隔离开来?