【问题标题】:server connection thread too late than onCreate服务器连接线程晚于 onCreate
【发布时间】:2018-11-26 20:42:19
【问题描述】:

我正在制作从 mvc spring 服务器获取服务器数据的应用程序。
如果客户端在主 Activity 中登录成功,应用会尝试从服务器获取数据,并在下一个 Activity 中使用列表视图显示数据。
它在第一次登录时工作正常,但是当我重新打开主活动并再次尝试登录时,下一个活动没有显示任何内容。
我使用日志来查找问题,我发现当客户端再次登录时,下一个活动的onCreate()onResume() 工作得太快了。我的应用程序使用线程并从服务器获取数据,日志说在onCreateonResume 工作之后,我的线程从服务器获取数据。

这是我的问题

1 App使用线程从服务器获取数据

2 第一次尝试有效,但线程比活动中的 onResume 和 onCreate 晚了

3我应该让线程更快吗?或使用标志或其他东西使 onCreate 和 onResume 在线程工作结束后工作?还是我的代码有问题?

这是我的活动,显示来自服务器的数据

public class ServerListActivity extends AppCompatActivity {
public static ArrayList<ServerListItem> serverListItemArrayList;
public static ArrayList<ServerListItem> scrollEventServerListItemList;
public TextView serverListInfoTextView;
private ProgressBar progressBar;
private boolean lockListView; 
private boolean isThisLastItemVisibleFlag;
private ServerListViewAdapter serverListViewAdapter;
private int currentPageNum;
public Handler msgHandler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    lockListView = false; // scroll event
    currentPageNum = 0; // scroll event
    isThisLastItemVisibleFlag = false; // scroll event

    scrollEventServerListItemList = new ArrayList<>();
    serverListItemArrayList = new ArrayList<>();
    msgHandler = new Handler();
    super.onCreate(savedInstanceState);
    ServerListManager serverListManager = new ServerListManager(msgHandler);
    serverListManager.getServerList();

    setContentView(R.layout.activity_server_list);
    ImageButton turnBackBtn = findViewById(R.id.turn_back_btn);
    serverListInfoTextView = findViewById(R.id.server_list_Info);
    ListView serverListView = findViewById(R.id.server_list_view);
    progressBar = findViewById(R.id.progressBar);

    serverListViewAdapter = new ServerListViewAdapter(scrollEventServerListItemList, R.layout.server_list_item, getApplicationContext());
    serverListView.setAdapter(serverListViewAdapter);
    progressBar.setVisibility(View.GONE);
    serverListView.setTranscriptMode(ListView.TRANSCRIPT_MODE_NORMAL);
    System.out.println(serverListItemArrayList.size());
    setServerListInfo(serverListItemArrayList);

这是我的主题

public class ServerListManager {
private final static int SERVER_PROBLEM = 666;
private Handler handler;

public ServerListManager(Handler handler) {
    this.handler = handler;
}

public void getServerList() {

    new Thread(new Runnable() {

        @Override
        public void run() {
            HttpURLConnection connection = null;
            StringBuilder stringBuffer = new StringBuilder();

            try {
                URL url = new URL("my ip and blah balh");
                connection = (HttpURLConnection) url.openConnection();
            } catch (IOException e) {
                e.printStackTrace();
            }

            if (connection != null) {
                connection.setConnectTimeout(5000);
                connection.setUseCaches(false);

                try {
                    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "utf-8"));
                    String line = bufferedReader.readLine();
                    if (!"".equals(line)) {
                        stringBuffer.append(line);
                        Log.i("ServerListManager", stringBuffer.toString());
                    }
                    setServerListItem(stringBuffer.toString());

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }).start();
}

private void setServerListItem(String dataFromServer) {
    Log.i("ServerListManager", "setServerListItem() works ");
    ArrayList<ServerListItem> serverListItems = new ArrayList<>();
    JsonParser jsonParser = new JsonParser();
    JsonObject jsonObjectFirst = (JsonObject) jsonParser.parse(dataFromServer);
    if (!String.valueOf(jsonObjectFirst.get("status")).equals("\"200\"")) {
        Message message = new Message();
        message.what = SERVER_PROBLEM;
        handler.sendMessage(message);
    } else {
        String serverListJsonVersion = String.valueOf(jsonObjectFirst.get("serverModelList"));
        JsonArray jsonArray = (JsonArray) jsonParser.parse(serverListJsonVersion);
        Gson gson = new Gson();
        for (JsonElement jsonElement : jsonArray) {
            ServerListItem serverListItem = gson.fromJson(jsonElement, ServerListItem.class);
            serverListItems.add(serverListItem);
        }
        ServerListActivity.serverListItemArrayList = serverListItems;
    }
}

【问题讨论】:

标签: java android web server


【解决方案1】:

您可以尝试使用AsyncTask

private class AsyncCaller extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        //this method will be running on UI thread
        //can call progress bar here to show loading process
    }

    @Override
    protected Void doInBackground(Void... params) {

        //this method will be running on background thread 
        //so don't update UI from here
        //do your long running http tasks here,
        //you don't want to pass argument and you
        //can access the parent class' variable url over here

        // call your server data here
        serverListManager.getServerList();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        //this method will be running on UI thread
        //Show the result obtained from doInBackground
        //this executed after doInBackground so after you get data from doInBackground
        //you can set your adapter here
    }

}

然后你可以这样执行AsyncTask

new AsyncCaller().execute();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 2019-03-14
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多