在我的 Toast 中显示 null

Show a null in my Toast

我是 Android 开发的新手,我 运行 我的应用程序非常简单,但我的 Toast 显示 null。我检查了我的连接,192.168.1.37/get_cat.php 在我的浏览器中是正确的。我认为服务器上的所有内容都是正确的并且工作正常。按照我的代码:

public class MainActivity extends AppCompatActivity {
private String line;
private String json;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Json_print();
    Toast.makeText(this, json, Toast.LENGTH_SHORT).show();
}

private void Json_print() {

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL("http://192.168.1.37/get_cat.php");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setDoInput(true);
                connection.setConnectTimeout(10000);
                connection.setReadTimeout(10000);

                InputStream inputStream = connection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

                StringBuilder stringBuilder = new StringBuilder();
                JSONObject jsonObject = new JSONObject();
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuilder.append(line);
                }

                json = stringBuilder.toString();

            } catch (Exception e) {
                Log.d("tag", e.toString());
            }
        }
    });

    thread.start();



}

您正在开始 async 操作,当您的 toast 显示任务尚未完成且 json 字段仍为 null

试试这个

public class MainActivity extends AppCompatActivity {
private String line;
private String json;

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

private void Json_print() {

    Thread thread = new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                URL url = new URL("http://192.168.1.37/get_cat.php");
                HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                connection.setRequestMethod("GET");
                connection.setDoInput(true);
                connection.setConnectTimeout(10000);
                connection.setReadTimeout(10000);

                InputStream inputStream = connection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

                StringBuilder stringBuilder = new StringBuilder();
                JSONObject jsonObject = new JSONObject();
                while ((line = bufferedReader.readLine()) != null) {
                    stringBuilder.append(line);
                }

                json = stringBuilder.toString();
                runOnUiThread(new Runnable() {
                   @Override
                   public void run() {
                         Toast.makeText(MainActivity.this, json, Toast.LENGTH_SHORT).show();
                   }
                });

            } catch (Exception e) {
                Log.d("tag", e.toString());
            }
        }
    });

    thread.start();
}

字段 json 为空,因为您的网络调用正在另一个线程中进行。当您调用 Json_print() 时,代码不会等待您创建的 Thread 中的代码完成,而是立即调用 Toast

相反,将您的 Toast 调用放在函数中,如下所示:

private void showToast() {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            Toast.makeText(this, json, Toast.LENGTH_SHORT).show();
        }
    });
}

在发出网络请求的后台Thread结束时调用此函数。确保对该函数的调用在您的 Thread run 函数中。请注意确保它在主 UI 线程上是 运行 的重要性,如果在 UI 线程上不是 运行 它将崩溃。