2015-11-02 42 views
1

我可以使用這種方式使用Okhttp將字符串上傳到服務器嗎?使用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()); 
} 
+0

可能包括與反應式編程,像RX-java的 –

回答

2

如果您想使用沒有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() 
        } 
       }); 
      } 
     }); 
    } 
} 
+0

嘿男人謝謝你的回答,在這段代碼中,你究竟是什麼東西?如果我想從數據庫中檢索specefic值,該怎麼辦?我們應該添加一個Body?,以及如果我想將某些內容發送到數據庫呢?我使用inputsream還是什麼? – Moudiz

+0

響應與同步方式相同,如果要發送數據,請使用POST請求 – BNK

+0

謝謝man ill試試 – Moudiz

1

網絡調用必須完成關閉的UI線程,所以沒有。

你也從來沒有打電話給你的run()方法,在您的活動,所以它不會被執行

編輯:最大皮諾是在RXJava正確可以用來使這種調用很容易,但是,仍然會在不同的線程上執行呼叫

+0

我從來沒有使用RX java中,要使用到使用異步任務我的方法,順便說一句是正確的添加JSON這樣的代碼? .add(「result」,json) – Moudiz

+0

我不確定您的JSON問題,但繼承人如何在需要異步任務的自動正確情況下使用RX,如果您感興趣: http://stackoverflow.com/問題/ 33415151/asynctask-replacement-with-rxjava-help-needed/33421148#33421148 如果它對你有幫助,請將我的答案標記爲正確! –

+0

比你的幫助,生病請求另一個問題與我的JSON有關,你可以請它嗎?這是網址http://stackoverflow.com/questions/33486899/json-object-and-okhttp-sending-data – Moudiz