2012-12-02 47 views
3

當我執行此操作時,我得到一個關閉力量。事情是。數據確實發送到我的數據庫。所以這是我的數據庫,但我讀我的logcat的,它說,我得到了在我這裏DinBackground一個問題是我的代碼:在異步任務DoInBackground Erorr android

// JSON Response node names 
private static String KEY_SUCCESS = "success"; 
private static String KEY_ERROR = "error"; 
private static String KEY_ERROR_MSG = "error_msg"; 
private static String KEY_UID = "uid"; 
private static String KEY_NAME = "name"; 
private static String KEY_EMAIL = "email"; 
private static String KEY_CREATED_AT = "created_at"; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.register); 


    // Importing all assets like buttons, text fields 
    inputFullName = (EditText) findViewById(R.id.registerName); 
    inputEmail = (EditText) findViewById(R.id.registerEmail); 
    inputPassword = (EditText) findViewById(R.id.registerPassword); 
    btnRegister = (Button) findViewById(R.id.btnRegister); 
    btnLinkToLogin = (Button) findViewById(R.id.btnLinkToLoginScreen); 
    registerErrorMsg = (TextView) findViewById(R.id.register_error); 

    // Register Button Click event 
    btnRegister.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View view) { 

      new CreateNewProduct().execute(); 
     } 
    }); 


} 

class CreateNewProduct extends AsyncTask<String, String, String> { 

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(RegisterActivity.this); 
     pDialog.setMessage("Loading"); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 

    } 

    /** 
    * Creating product 
    * */ 
    protected String doInBackground(String... args) { 
     String name = inputFullName.getText().toString(); 
     String email = inputEmail.getText().toString(); 
     String password = inputPassword.getText().toString(); 
     UserFunctions userFunction = new UserFunctions(); 
     JSONObject json = userFunction.registerUser(name, email, password); 

     // check for login response 
     try { 
      if (json.getString(KEY_SUCCESS) != null) { 
       registerErrorMsg.setText(""); 
       String res = json.getString(KEY_SUCCESS); 
       if(Integer.parseInt(res) == 1){ 
        // user successfully registred 
        // Store user details in SQLite Database 
        DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
        JSONObject json_user = json.getJSONObject("user"); 

        // Clear all previous data in database 
        userFunction.logoutUser(getApplicationContext()); 
        db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT)); 
        // Launch Dashboard Screen 

        // Close Registration Screen 
        finish(); 
       }else{ 
        // Error in registration 
        registerErrorMsg.setText("Error occured in registration"); 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    * **/ 
    protected void onPostExecute(String file_url) { 
     // dismiss the dialog once done 
     pDialog.dismiss(); 
     Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class); 
     // Close all views before launching Dashboard 
     dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(dashboard); 
    } 

} 

這裏是我的logcat:

12-02 15:35:33.761: E/AndroidRuntime(671): FATAL EXCEPTION: AsyncTask #1 
12-02 15:35:33.761: E/AndroidRuntime(671): java.lang.RuntimeException: An error occured while executing doInBackground() 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.os.AsyncTask$3.done(AsyncTask.java:278) 
12-02 15:35:33.761: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
12-02 15:35:33.761: E/AndroidRuntime(671): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
12-02 15:35:33.761: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
12-02 15:35:33.761: E/AndroidRuntime(671): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:208) 
12-02 15:35:33.761: E/AndroidRuntime(671): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
12-02 15:35:33.761: E/AndroidRuntime(671): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
12-02 15:35:33.761: E/AndroidRuntime(671): at java.lang.Thread.run(Thread.java:856) 
12-02 15:35:33.761: E/AndroidRuntime(671): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4039) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.view.ViewRootImpl.invalidateChild(ViewRootImpl.java:722) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:771) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.view.ViewGroup.invalidateChild(ViewGroup.java:4005) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.view.View.invalidate(View.java:8576) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.view.View.invalidate(View.java:8527) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.widget.TextView.checkForRelayout(TextView.java:6760) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.widget.TextView.setText(TextView.java:3306) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.widget.TextView.setText(TextView.java:3162) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.widget.TextView.setText(TextView.java:3137) 
12-02 15:35:33.761: E/AndroidRuntime(671): at com.laurenswuyts.find.it.RegisterActivity$CreateNewProduct.doInBackground(RegisterActivity.java:100) 
12-02 15:35:33.761: E/AndroidRuntime(671): at com.laurenswuyts.find.it.RegisterActivity$CreateNewProduct.doInBackground(RegisterActivity.java:1) 
12-02 15:35:33.761: E/AndroidRuntime(671): at android.os.AsyncTask$2.call(AsyncTask.java:264) 
12-02 15:35:33.761: E/AndroidRuntime(671): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
12-02 15:35:33.761: E/AndroidRuntime(671): ... 5 more 

回答

0

您正在訪問UI元素裏面的doInBackground()。顧名思義,doInBackgroud()是背景(非UI)線程,並且無權訪問UI元素。所以,你應該把這個代碼放在onPreExecute()這是一個UI線程。從onPreExecute中的UI元素獲取用戶輸入,並將它們存儲在字符串中,稍後在doInBackground()中使用它們。

class CreateNewProduct extends AsyncTask<String, String, String> { 

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    String name, email, password; 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(RegisterActivity.this); 
     pDialog.setMessage("Loading"); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(true); 
     pDialog.show(); 
     name = inputFullName.getText().toString(); 
     email = inputEmail.getText().toString(); 
     password = inputPassword.getText().toString(); 

    } 

    /** 
    * Creating product 
    * */ 
    protected String doInBackground(String... args) { 

     UserFunctions userFunction = new UserFunctions(); 
     JSONObject json = userFunction.registerUser(name, email, password); 

     // check for login response 
     try { 
      if (json.getString(KEY_SUCCESS) != null) { 
       registerErrorMsg.setText(""); 
       String res = json.getString(KEY_SUCCESS); 
       if(Integer.parseInt(res) == 1){ 
        // user successfully registred 
        // Store user details in SQLite Database 
        DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
        JSONObject json_user = json.getJSONObject("user"); 

        // Clear all previous data in database 
        userFunction.logoutUser(getApplicationContext()); 
        db.addUser(json_user.getString(KEY_NAME), json_user.getString(KEY_EMAIL), json.getString(KEY_UID), json_user.getString(KEY_CREATED_AT)); 
        // Launch Dashboard Screen 

        // Close Registration Screen 
        finish(); 
       }else{ 
        // Error in registration 
        //show error message to user in onPostExecute 
       } 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    * **/ 
    protected void onPostExecute(String file_url) { 
     // dismiss the dialog once done 
     pDialog.dismiss(); 
     Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class); 
     // Close all views before launching Dashboard 
     dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
     startActivity(dashboard); 
    } 

} 

此外, 您的參數是錯誤的,當你調用的AsyncTask。

由於您已聲明它爲class CreateNewProduct extends AsyncTask<String, String, String>,因此您在調用AsyncTask時需要傳遞一個String。因此,new CreateNewProduct().execute("");將是撥打電話的正確方法。

+0

謝謝我改變它,但它仍然無法正常工作。我用我的logcat編輯我的帖子。 – Laurenswuyts

+0

是的,那是因爲registerErrorMessage是一個UI元素。 – Swayam

+0

您無法顯示來自doInBackground的錯誤消息。你應該做的是在發生錯誤時設置一個布爾標誌,然後在onPostExecute()中檢查標誌的值,並在需要時向用戶顯示錯誤消息。 – Swayam