在没有异步任务的情况下使用 okhttp 发送数据

send data using okhttp without async task

我可以使用这种方式通过 Okhttp 将字符串上传到服务器吗?

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.register);
    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);

     usernam = (EditText) findViewById(R.id.username);
     passw = (EditText) findViewById(R.id.password);
     email = (EditText) findViewById(R.id.email);

     name = usernam.getText().toString();
     pass = passw.getText().toString();
     emails = email.getText().toString();

}


private final OkHttpClient client = new OkHttpClient();

public void run() throws Exception {
    String json = "";

    JSONObject jsonObject = new JSONObject();
    jsonObject.accumulate("name",name );
    jsonObject.accumulate("password",pass );
    jsonObject.accumulate("email",emails );

    json = jsonObject.toString();

    RequestBody formBody = new FormEncodingBuilder()
            .add("result", json)
            .build();
    Request request = new Request.Builder()
            .url("https://justedhak.comlu.com/receiver.php")
            .post(formBody)
            .build();

    Response response = client.newCall(request).execute();
    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

    System.out.println(response.body().string());
}

网络调用必须在 UI 线程之外完成,所以不能。

此外,您从未在 activity 中调用 运行() 方法,因此它不会被执行

编辑:Max Pino 是正确的,因为 RXJava 可以用来轻松地进行这种调用,但是,它仍然会在不同的线程上执行调用

如果想在没有AsyncTask的情况下使用OkHttp,可以参考下面的示例代码,希望对您有所帮助!

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()
                    }
                });
            }
        });
    }
}