繁体   English   中英

主线程如何将信息传输到子线程(如何在run方法中处理消息?)?

[英]How does the main thread transmit information to the child thread (How can I handle message in the run method?)?

    public class MainActivity extends AppCompatActivity {

    public static final int TRANSMIT_DATA = 1;
    public static String string0;
    public String temp;//定义全局变量,想要把string0的值传给它。

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        loadData();
        System.out.println("Main output:ID="+Thread.currentThread().getId());
        anotherThread();
    }

    public void anotherThread(){
        new Thread(){
            public void run() {
                System.out.println("anotherThread :ID="+Thread.currentThread().getId());
                System.out.println("anotherThread output: Content="+temp);
            }
        }.start();  //开启一个线程
    }

    private Handler dataHandler =new Handler(){
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case TRANSMIT_DATA:
                    System.out.println("handleMessage output:ID="+Thread.currentThread().getId());
                    System.out.println("handleMessage output: Content="+msg.obj);

                    temp=msg.obj.toString();

                    break;
                default:
                    break;
            }
        }
    };


    public  void loadData() {


        OkHttpClient okHttpClient = new OkHttpClient();
        //构造Request,
        //builder.get()代表的是get请求,url方法里面放的参数是一个网络地址
        Request.Builder builder = new Request.Builder();

        final Map params = new LinkedHashMap();// 请求参数

        Request request = builder.get()
                .url("https://api.avatardata.cn/Jztk/Query?key=15f9ceafeeb94a2492fd84b8c68a554c&subject=4&model=c1&testType=rand")
                .build();
        //3将Request封装成call
        Call call = okHttpClient.newCall(request);

        //4,执行call,这个方法是异步请求数据
        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                //失败调用
                Log.e("MainActivity", "onFailure: " );
            }

            @Override
            public void onResponse(Call call, final Response response) throws IOException {
                //成功调用
                Log.e("MainActivity", "onResponse: " );

                //获取网络访问返回的字符串
                string0 = response.body().string();

                System.out.println("Asynchronous Request Output:ID="+Thread.currentThread().getId());

                Message message = new Message();
                message.obj = string0;
                message.what =TRANSMIT_DATA;

                dataHandler.sendMessage(message);

            }
        });

    }

}

图片是关于System.out.println

就像上面的图片一样:“ anotherThread输出:Content = null”,我想将信息从主线程传递到子线程(在run方法中),该怎么办? 尝试避免尽快更改其他方法的代码。

考虑到您希望进行最少的代码更改,您可以使用ThreadLocal,在父线程中设置的值ThreadLocal可用于所有子线程

我认为您的“ otherthread”在temp变量中的数据可用之前开始和结束,因此它显示null。

您可以执行以下操作:

一种。 在handleMessage函数中填充temp变量后,您可以启动/运行“ otherthread”。

或者,如果您坚持要在拥有数据之前启动“ otherthread”,请以同步方式使线程运行,请在一定间隔后检查temp变量是否为非null。 还有一些sortof布尔值让线程知道,以防万一您没有收到任何数据而退出。

我的2美分

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM