如何在另一个线程中运行套接字代码?

时间:2017-12-19 06:11:13

标签: java android multithreading sockets

在我的应用程序中,我有适配器,在此适配器中,我应该调用 socket
我希望在另一个主题中调用套接字,而不是在 MainThread 中调用。
我写了 socket 代码,但我不知道如何在另一个帖子中调用它。

我的套接字代码:

mSocket.on("finish", new Emitter.Listener() {
    @Override
    public void call(final Object... args) {
        try {
            Constants.currentActivity.runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Log.e("socketLogs", args[0] + "");
                    try {
                        startTimer();
                        final FinishResponse finishResponse = new Gson().fromJson(args[0].toString(), FinishResponse.class);
                        countDownerLayout.setVisibility(View.GONE);
                        winnerLay.setVisibility(View.VISIBLE);
                        bidCount.setVisibility(View.GONE);
                        offerCount.setVisibility(View.GONE);
                        price.setVisibility(View.GONE);
                        timeView.setVisibility(View.GONE);
                        userPic.setVisibility(View.GONE);
                        winnerLay.setBackgroundColor(ContextCompat.getColor(context, R.color.white));
                        //if (finishResponse.getRes().getWinnerAvatar() != null && !finishResponse.getRes().getWinnerAvatar().equals("")) {
                            Glide.with(context)
                                    .load(Constants.SERVER + finishResponse.getRes().getWinnerAvatar())
                                    .placeholder(R.mipmap.ic_launcher)
                                    .diskCacheStrategy(DiskCacheStrategy.ALL)
                                    .into(User);
                       /* } else {
                            User.setImageDrawable(ContextCompat.getDrawable(context, R.mipmap.ic_launcher_round));
                        }*/
                        edtUserName.setText(finishResponse.getRes().getWinnerName());
                        edtUserName.setTextColor(ContextCompat.getColor(context, R.color.black));
                        txtStartPrice.setText("Sell");
                        txtStartPrice.setBackgroundColor(ContextCompat.getColor(context, R.color.TextColorGreen));
                        txtStartPrice.setTextColor(ContextCompat.getColor(context, R.color.white));
                        try {
                            String[] splitDate = finishResponse.getRes().getEnd().split(" ");
                            String[] dateSpliet = splitDate[0].split("-");
                            TimeUtils timeUtils = new TimeUtils(Integer.parseInt(dateSpliet[0]), Integer.parseInt(dateSpliet[1]), Integer.parseInt(dateSpliet[2]));
                            txtPrice.setText(splitDate[1] + "  " + timeUtils.getIranianDate());
                        } catch (Exception e) {
                        }
                    } catch (JsonSyntaxException e) {
                    }
                }
            });
        } catch (Exception e) {

        }
    }
});

我在适配器getView方法中编写了上述代码 但是我希望在另一个帖子中写上面的代码,而不在MainThread中运行

我该怎么做?

1 个答案:

答案 0 :(得分:0)

只需为此创建新线程

Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // do stuff
            }
};
new Thread(runnable).start();

我会就您的代码提出一些建议。首先,在 getView 中调用适配器中的Socket是不好的。您应该在片段或活动中调用它(如果您不使用MVP或其他架构)。

下一个大问题是你有当前活动保存在常量

Constants.currentActivity

它会导致内存泄漏,即使你关闭它也会活动,你的应用程序会遇到很多问题。