2015-11-03 73 views
1

我的应用程序中有一个按钮,当我点击它时,它声明方法insertintodatabase。但是,当我点击它时什么也没有发生,即使log没有显示任何东西。 问题在哪里?请建议。点击按钮时异步方法没有运行

private final OkHttpClient client = new OkHttpClient(); 
    public void SignUp(View view) 
    { 
     insertToDatabase(); 

    } 
    private void insertToDatabase(){ 
     class SendPostReqAsyncTask extends AsyncTask<String, Void, String> { 
      @Override 
      protected void onPreExecute() 
      { 
       name = usernam.getText().toString(); 
       pass = passw.getText().toString(); 
       emails = email.getText().toString(); 
       Log.e("GetText","called"); 

      } 
      @Override 
      protected String doInBackground(String... params) { 

       String json = ""; 

       try { 
        JSONObject jsonObject = new JSONObject(); 
        jsonObject.accumulate("name", name); 
        jsonObject.accumulate("password", pass); 
        jsonObject.accumulate("email", emails); 
        json = jsonObject.toString(); 
        Log.e("MYAPP", "getjson"); 

       } catch (JSONException e) { 
        Log.e("MYAPP", "unexpected JSON exception", e); 
       } 
       try{ 
        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); 


      } catch (IOException e){ 
        Log.e("MYAPP", "unexpected JSON exception", e); 
       } 

        return "success"; 
      } 

      @Override 
      protected void onPostExecute(String result) { 
       super.onPostExecute(result); 

       Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 

      } 

PHP

$username= $_POST['username']; 
$password= $_POST['password']; 
$email= $_POST['email']; 
$image =$_POST['image']; 
$sql = "insert into USERS (username,password,email) values ('$username','$password','$email')"; 
if(mysqli_query($con,$sql)){ 
    echo 'success'; 
} 
else{ 
echo 'failure'; 
    } 
mysqli_close($con); 
+0

为什么不把你的asynctask类放到'insertToDatabase'之外?然后在'insertToDatabase'里面只需要调用'new SendPostReqAsyncTask()。execute(...);' – BNK

+0

你需要调用你的异步任务,在你的类完成后放这个行'new DownloadFilesTask()。execute(url1,url2 ,url3);' –

+0

@BNK您可以在您的评论中指定一个名为insertintodatabase.java的新活动,然后从主活动中调用它? – Moudiz

回答

1

因为OkHttp支持用异步,我想你也可以参考以下方式:

让我们假设你有mHandler = new Handler(Looper.getMainLooper());onCreate

private void updateToDatabase() { 
     // POST request 
     OkHttpClient client = new OkHttpClient(); 
     RequestBody requestBody = new FormEncodingBuilder() 
       .add("key1", "value1") 
       .add("key2", "value2") 
       .build(); 
     Request request = new Request.Builder() 
       .url("http://...") 
       .post(requestBody) 
       .build(); 
     client.newCall(request).enqueue(new Callback() { 
      @Override 
      public void onFailure(final Request request, final IOException e) { 
       mHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(mContext, e.toString(), Toast.LENGTH_SHORT).show(); 
        } 
       });           
      } 

      @Override 
      public void onResponse(Response response) throws IOException { 
       mHandler.post(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(mContext, response.body().string(), Toast.LENGTH_SHORT).show(); 
        } 
       });          
      } 
     }); 
    } 

如果你仍然想的AsyncTask使用,更新您的代码如下所示:

public class MainActivity extends AppCompatActivity { 
    ... 
    public void SignUp(View view) 
    { 
     new SendPostReqAsyncTask().execute(); 
    } 

    ... 
    private class SendPostReqAsyncTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected void onPreExecute() { 
      name = usernam.getText().toString(); 
      pass = passw.getText().toString(); 
      emails = email.getText().toString(); 
      Log.e("GetText", "called"); 
     } 
     @Override 
     protected String doInBackground(String... params) { 
      String json = ""; 
      try { 
       JSONObject jsonObject = new JSONObject(); 
       jsonObject.accumulate("name", name); 
       jsonObject.accumulate("password", pass); 
       jsonObject.accumulate("email", emails); 
       json = jsonObject.toString(); 
       Log.e("MYAPP", "getjson"); 
      } catch (JSONException e) { 
       Log.e("MYAPP", "unexpected JSON exception", e); 
      } 
      try { 
       OkHttpClient client = new OkHttpClient(); 
       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); 
      } catch (IOException e) { 
       Log.e("MYAPP", "unexpected JSON exception", e); 
      } 
      return "success"; 
     } 
     @Override 
     protected void onPostExecute(String result) { 
      super.onPostExecute(result); 
      Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 
     } 
    } 
} 
+0

那么不需要使用异步任务呢? – Moudiz

+0

是的,但是,如果你想更新UI的视图,如textView ...,那么你必须使用处理程序作为我的回答在你以前的问题:) – BNK

+0

好吧然后生病第一次完成这一个异步任务,然后生病试试你的方式,并检查哪个更好 – Moudiz

1

某处你必须创建SendPostReqAsyncTask的对象,并调用execute方法传递参数...

// Example class 
class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { 
// some code 
} 

// Call the execute method of Async Task 
new DownloadFilesTask().execute(url1, url2, url3); 
1

//使用这样的..

public class <Your Root class> extends Activity{ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    // some code 

     private final OkHttpClient client = new OkHttpClient(); 
     public void SignUp(View view) 
     { 
      new SendPostReqAsyncTask().execute(); 
     } 
    } 
    class SendPostReqAsyncTask extends AsyncTask<String, Void, String> { 
      @Override 
      protected void onPreExecute() 
      { 
      name = usernam.getText().toString(); 
      pass = passw.getText().toString(); 
      emails = email.getText().toString(); 
      Log.e("GetText","called"); 

     } 
     @Override 
     protected String doInBackground(String... params) { 

     String json = ""; 

         try { 
          JSONObject jsonObject = new JSONObject(); 
          jsonObject.accumulate("name", name); 
          jsonObject.accumulate("password", pass); 
          jsonObject.accumulate("email", emails); 
          json = jsonObject.toString(); 
          Log.e("MYAPP", "getjson"); 

         } catch (JSONException e) { 
          Log.e("MYAPP", "unexpected JSON exception", e); 
         } 
         try{ 
          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); 


        } catch (IOException e){ 
          Log.e("MYAPP", "unexpected JSON exception", e); 
         } 

          return "success"; 
        } 

        @Override 
        protected void onPostExecute(String result) { 
         super.onPostExecute(result); 

         Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show(); 

        } 

} 
+0

您应该将String参数传递到新的SendPostReqAsyncTask()。execute(); :) – BNK

+0

这是没有必要的。我用了很多次。\ –

+0

嗯,那是因为你不需要任何参数来处理asynctask类中的内容 – BNK