Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OkHTTP从队列回调更新UI_Android_Okhttp - Fatal编程技术网

Android OkHTTP从队列回调更新UI

Android OkHTTP从队列回调更新UI,android,okhttp,Android,Okhttp,我正在尝试使用OkHTTP库。呼叫服务器并获得成功响应时。我需要更新用户界面 在使用enqueue()进行异步调用时,如何做到这一点 试试这个: Handler mainHandler = new Handler(Looper.getMainLooper()); mainHandler.post(new Runnable() { @Override public void run() { // code to interact with UI } });

我正在尝试使用OkHTTP库。呼叫服务器并获得成功响应时。我需要更新用户界面

在使用enqueue()进行异步调用时,如何做到这一点

试试这个:

Handler mainHandler = new Handler(Looper.getMainLooper());
mainHandler.post(new Runnable() {
    @Override
    public void run() {
        // code to interact with UI
    }
});

您可以参考以下示例代码,希望对您有所帮助

public class MainActivity extends AppCompatActivity {
    private static final String LOG_TAG = "OkHttp";
    private TextView mTextView;
    private Handler mHandler;
    private String mMessage;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.textView);
        mHandler = new Handler(Looper.getMainLooper());
        OkHttpClient client = new OkHttpClient();
        // GET request
        Request request = new Request.Builder()
                .url("http://...")
                .build();
        client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Request request, IOException e) {
                mMessage = e.toString();
                Log.e(LOG_TAG, mMessage); // no need inside run()
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mTextView.setText(mMessage); // must be inside run()
                    }
                });
            }

            @Override
            public void onResponse(Response response) throws IOException {
                mMessage = response.toString();
                Log.i(LOG_TAG, mMessage); // no need inside run()
                mHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mTextView.setText(mMessage); // must be inside run()
                    }
                });
            }
        });
    }
}

如果您的代码没有更新UI,我建议您指定线程,因为UI位于自己的线程上:

client.newCall(request).enqueue(new Callback() {

    @Override
    public void onFailure(Request request, IOException e) {

    }

    @Override
    public void onResponse(Response response) throws IOException {

        if (response.isSuccessful()) {
            runOnUiThread(new Runnable() {

                @Override
                public void run() {
                    //TODO: update your UI
                }

            });
        } 
    }
});

为了有一个干净的代码,我建议您不要将整个代码放在runnable中

一个简单的例子:

public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
            .url("http://...").build();

        client.newCall(request).enqueue(new Callback() {


            @Override
            public void onFailure(Request request, IOException e) {
                e.printStackTrace();
            }


            @Override
            public void onResponse(Response response) throws IOException {

                final String body = response.body().string();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        updateUI(body);
                    }
                });

            }


        });
    }

    private void updateUI(responseBody){
        //TODO: update your UI
    }

}

使用处理程序的好例子
public class MainActivity extends AppCompatActivity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
            .url("http://...").build();

        client.newCall(request).enqueue(new Callback() {


            @Override
            public void onFailure(Request request, IOException e) {
                e.printStackTrace();
            }


            @Override
            public void onResponse(Response response) throws IOException {

                final String body = response.body().string();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        updateUI(body);
                    }
                });

            }


        });
    }

    private void updateUI(responseBody){
        //TODO: update your UI
    }

}