android假如主线程依赖子线程A的执行结果,如何让A执行完成,之后主线程再往下执行呢?

/*
String ObjectResult="原先的结果";
//使用VOLLY框架(与问题无关)
JsonObjectRequest jsonObjectRequest = new JsonObjectRequest (url, null , new Listener<JSONObject>(
                ) {
                    //匿名内部类中的方法
                    @Override
                    public void onResponse(JSONObject response) {
                        ObjectResult = response.toString();
                        Log.i("TAG", "内部类:"+ObjectResult);
                    }            
        });
queue.add(jsonObjectRequest);
Log.i("TAG","外部类:"+ObjectResult);
*/

这段程序中执行过程中,是先执行了"Log.i("TAG","外部类:"+ObjectResult);"再执行了匿名内部类中的方法。现在我希望用子线程控制其先执行匿名内部类,之后再执行外部类的操作,具体的方法是什么?
谢谢了!

阅读 11.5k
4 个回答

你内部类中的方法是要在获得reponse之后才能执行。要达成你的目的,必须自己实现一个回调方法。比如像这样,

@Override
public void onResponse(JSONObject response) {
    ObjectResult = response.toString();
    callback.dosomething(ObjectResult);//自己实现的回调方法
}   

强烈建议你看下观察者模式。以我的看法,观察者模式的设计思路非常适合构造回调方法。至于具体的实现,你就要看一下ls的handler。

抛开你这段代码不看,单根据你的标题来回答:

android假如主线程依赖子线程A的执行结果,如何让A执行完成,之后主线程再往下执行呢?

需要在子线程执行完成的地方,通过主线程的Handler发送一条消息;主线程收到消息后执行:

public class MainActivity extends Activity {
    private Handler uiHandler = new Handler(){
        // 覆写这个方法,接收并处理消息。
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case 1:
                    break;
            }
        }
    };
    
    class ChildThread extends Thread{
        @Override
        public void run() {
            try{
                // 子线程执行完毕的地方,利用主线程的handler发送消息
                Message msg = new Message();
                msg.what = 1;
                uiHandler.sendMessage(msg);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
        }
    }

PS:主线程是UI线程,不要试图让UI线程等待某个结果,之后再往下执行,这会导致UI卡顿。
UI线程是一直循环的,我们需要通过消息机制通知UI线程去做一些事情。

更多的可以参考:
Android中Handler的使用
安利我的一篇笔记 : ) Android_Message_Handler_消息处理机制总结笔记

新手上路,请多包涵

你好, 我现在也遇到了同样的,
我想要在外部类的方法中药一个返回值,内部类是网络请求获取的json,
现在的问题也是先执行了外部类的方法,
请问你现在解决了么

网络请求设置成同步的不就可以了

推荐问题
宣传栏