Android Toast不显示

时间:2019-09-09 10:08:26

标签: android tcpclient toast

我有一个应用程序,该应用程序获取用户输入(名称和号码),然后扫描QR码,然后按一下按钮,它将数据发送到我的服务器并从中重放。 一切现在都可以正常进行了。(在调试模式下,我可以看到服务器的消息为字符串)。

但是我看不到吐司-它没有显示 为什么?

这是我在ScanActivity.java中拥有的类

public class ScannedBarcodeActivity extends AppCompatActivity {


SurfaceView surfaceView;
TextView txtBarcodeValue;
private BarcodeDetector barcodeDetector;
private CameraSource cameraSource;
private static final int REQUEST_CAMERA_PERMISSION = 201;
Button btnAction;
String intentData = "";

String  ServerReply;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scan_barcode);

    initViews();
}


private void initViews() {
    txtBarcodeValue = findViewById(R.id.txtBarcodeValue);
    surfaceView = findViewById(R.id.surfaceView);
    btnAction = findViewById(R.id.btnAction);

      btnAction.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (intentData.length() > 0) {

                Thread thread = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try  {

                            String server_ip = "My.Server.Public.IP";
                            int server_port = 9999;

                            String messageStr = intentData + "!" +  phone +"!"+ name+"!##";



                            Socket clientSocket = new Socket(server_ip, server_port);



                            PrintWriter mBufferOut = new PrintWriter((new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()))), true);
                            BufferedReader mBufferIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                            mBufferOut.println(messageStr);
                            ServerReply = mBufferIn.readLine();
                            mBufferIn.close();



      //see why this is not working - can;t see the toast
                            Toast.makeText(getApplicationContext(),"inside the thread",Toast.LENGTH_LONG).show();

                            clientSocket.close();


                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                });
             //   Toast.makeText(getApplicationContext(),ServerReply,Toast.LENGTH_LONG).show();
                thread.start();


                }

            Toast.makeText(getApplicationContext(),ServerReply,Toast.LENGTH_LONG).show();
            SystemClock.sleep(1000); //ms
            Toast.makeText(getApplicationContext(),"Going to Main Page now",Toast.LENGTH_LONG).show();
            finish();



        }


       // }
    });
}

这就是您告诉我要做的事情的样子:(仍然不起作用,由于某种原因,它“跳过”了吐司部分)

public class ScannedBarcodeActivity extends AppCompatActivity {


SurfaceView surfaceView;
TextView txtBarcodeValue;
private BarcodeDetector barcodeDetector;
private CameraSource cameraSource;
private static final int REQUEST_CAMERA_PERMISSION = 201;
Button btnAction;
String intentData = "";
boolean isEmail = false;

String  ServerReply;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scan_barcode);

    initViews();
}


private void initViews() {
    txtBarcodeValue = findViewById(R.id.txtBarcodeValue);
    surfaceView = findViewById(R.id.surfaceView);
    btnAction = findViewById(R.id.btnAction);

 ;


    btnAction.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (intentData.length() > 0) {

                Thread thread = new Thread(new Runnable() {

                    @Override
                    public void run() {
                        try  {

                            String server_ip = "My.Server.IP";
                            int server_port = 9999;

                            String messageStr = intentData + "!" +  phone +"!"+ name+"!##";

                            Socket clientSocket = new Socket(server_ip, server_port);

                            PrintWriter mBufferOut = new PrintWriter((new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()))), true);
                            BufferedReader mBufferIn = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));

                            mBufferOut.println(messageStr);

                            ServerReply = mBufferIn.readLine();
                            mBufferIn.close();

                            runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    Toast.makeText(getApplicationContext(),"inside the thread",Toast.LENGTH_SHORT).show();
                                }
                            });
                            clientSocket.close();


                        }
                        catch (Exception e)
                        {
                            e.printStackTrace();
                        }
                    }
                });

                thread.start();



                }


            SystemClock.sleep(1000); //ms

            finish();



        }


       // }
    });
}

5 个答案:

答案 0 :(得分:4)

这将在UI线程上执行

runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),"inside the thread",Toast.LENGTH_SHORT).show();
                }
            });

答案 1 :(得分:3)

所有UI渲染都应在主线程上完成,您可以使用视图处理程序来完成

v.post(new Runnable(){
  Toast.makeText(getApplicationContext(),"inside the thread",Toast.LENGTH_LONG).show();
});

答案 2 :(得分:2)

您的Toast来自后台线程,需要在主/ UI线程上执行

Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
    @Override
    public void run() {
        Toast.makeText(getApplicationContext(),"inside the thread",Toast.LENGTH_LONG).show();
    }
});

答案 3 :(得分:1)

Toast不能在UI线程之外的其他程序上运行,您可以使用

 runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                           //see why this is not working - can;t see the toast
                        Toast.makeText(getApplicationContext(),"inside the thread",Toast.LENGTH_LONG).show();

                        }
                    });

答案 4 :(得分:0)

1)您必须在UI线程中编写烤面包。像吹

// you can write toast in UI thread like this
             runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                        Toast.makeText(getApplicationContext(),"inside the thread",Toast.LENGTH_LONG).show();
                        }
                    });

2)您必须确保intentData.length()不为0(如果intentData为空,则线程将永远不会执行,请确保这一点。)

if (intentData.length() > 0) {...}

3)并在显示吐司消息之前确保您的代码没有被给予任何异常[按如下所示在catch块中处理您的异常]

catch (Exception e){
        Log.e("Exception","your exception is "+e.toString());
}

希望它对您有帮助。