簡體   English   中英

如何從 AsyncTask 中的服務器獲取字符串到 MainActivity?

[英]How to get string from a server in AsyncTask to a MainActivity?

我想顯示一個從服務器獲取的字符串,該字符串位於MainActivity textView 上的AsyncTask (或者我稱之為MessageSender類)中。 我知道我需要使用setText()方法。 我從服務器獲取字符串,它顯示在控制台中。

這是我的MessageSender類:

public class MessageSender  extends AsyncTask<String, Object, String>  {
    Socket socket;
    ObjectInputStream ois;
    ObjectOutputStream oos;
    BufferedInputStream bis;
    Object player;
    String userName;
    String level;
    String input = null;

    @Override
    protected String doInBackground(String... strings) {
        userName = strings [0];
        level = strings [1];
        player =  userName +"\n" + level ;

        try {
            socket= new Socket("192.168.1.179", 8884);
            System.out.println("********************");
            System.out.println("Connected to server");
            System.out.println("********************");
            oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(player);
            oos.flush();

            ois = new ObjectInputStream(socket.getInputStream());
            input = ois.readUTF();
            System.out.println(input);

        } catch (IOException e) {
            e.printStackTrace();
            //  socket.close();
        }
        return input;
    }
}

這是我的MainActivity類:

package com.example.whack_a_mole;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.TextView;

import com.google.android.material.button.MaterialButton;

public class MainActivity4 extends AppCompatActivity {
    private TextView textView;
    private MaterialButton newGameBtn;
    MessageSender ms=new MessageSender();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        textView=findViewById(R.id.first_place);
        textView.setText(ms.input);

        newGameBtn= findViewById(R.id.newGameBtn);
        newGameBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent= new Intent(MainActivity4.this, MainActivity.class);
                startActivity(intent);
                //uppdatera listan
            }
        });

    }
}

AsyncTask已棄用,請考慮使用其他東西


您可以創建一個接口,例如使用一種方法onInputReceived將其稱為MessageInputListener

public interface MessageInputListener {
    public void onInputReceived(String input);
}

通過MainActivity4實現該接口,將MessageInputListener作為參數添加到MessageSender構造函數,在創建MessageSender this MainActivity4 MessageSender onPostExecute

public class MainActivity4 extends AppCompatActivity implements MessageInputListener {
        // ...
    
    MessageSender ms = new MessageSender(this);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // ...
        
        ms.execute(...);
    }

    @Override
    public void onInputReceived(String input) {
        textView.setText(input);
    }
}

public class MessageSender  extends AsyncTask<String, Object, String>  {
    //...
    private MessageInputListener mListener;
    public MessageSender(MessageInputListener listener) {
        mListener = listener;
    }

    @Override
    protected void onPostExecute(String message) {
        if (mListener != null) {
            mListener.onInputReceived(message)
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM