2013-10-02 64 views
1

我已經爲我的android應用程序寫了一個日誌功能,我想讓它在API 17上工作,現在它在主線程異常上給出一個網絡,我知道你不能對網絡操作主線程中,我嘗試將線程放入,但似乎沒有去。所以,我現在Android AsyncTask不能正常工作

嘗試了的AsyncTask任何幫助建議將是巨大

package khs.studentsupport; 

import java.util.HashMap; 

import khs.supportapp.library.DatabaseHandler; 
import khs.supportapp.library.UserFunctions; 

import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class New_Login extends Activity{ 


    // Progress Dialog 
      private ProgressDialog pDialog; 


      public String storedEmail=""; 
      public String stroedPW = ""; 

      boolean GCMFlag=false; 
      // Shared Preferences 
      SharedPreferences pref; 

      // Editor for Shared preferences 
      Editor editor; 

      // Context 
      Context _context; 

      // Shared pref mode 
      int PRIVATE_MODE = 0; 

      // Sharedpref file name 
      private static final String PREF_NAME = "AndroidHivePref"; 

      // All Shared Preferences Keys 
      private static final String IS_LOGIN = "IsLoggedIn"; 

      // User name (make variable public to access from outside) 
      public static final String KEY_NAME = "name"; 

      // Email address (make variable public to access from outside) 
      public static final String KEY_EMAIL = "email"; 

      // Constructor 
      public void SessionManager(Context context){ 
       this._context = context; 
       pref = _context.getSharedPreferences(PREF_NAME, PRIVATE_MODE); 
       editor = pref.edit(); 
      } 

      /** 
      * Create login session 
      * */ 
      public void createLoginSession(String name, String email){ 
       // Storing login value as TRUE 
       editor.putBoolean(IS_LOGIN, true); 

       // Storing name in pref 
       editor.putString(KEY_NAME, name); 

       // Storing email in pref 
       editor.putString(KEY_EMAIL, email); 

       // commit changes 
       editor.commit(); 
      } 



      // Internet detector 
      ConnectionDetector cd; 


      AlertDialogManager alert = new AlertDialogManager(); 
      Button btnLogin; 
      Button btnLinkToRegister; 
      EditText inputEmail; 
      EditText inputPassword; 

      TextView loginErrorMsg; 

      // 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_STUDENT_ID = "studentUser"; 



      private static String KEY_CREATED_AT = "created_at"; 


      public HashMap<String, String> getUserDetails(){ 
        HashMap<String, String> user = new HashMap<String, String>(); 
        // user name 
        user.put(KEY_NAME, pref.getString(KEY_NAME, null)); 
        //ID of student 
        user.put(KEY_STUDENT_ID, pref.getString(KEY_STUDENT_ID, null)); 


        // user email id 
        user.put(KEY_EMAIL, pref.getString(KEY_EMAIL, null)); 

        // return user 
        return user; 
       } 

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




      } 

      // Response from Activity 
      @Override 
      protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
       super.onActivityResult(requestCode, resultCode, data); 
       // if result code 100 
       if (resultCode == 100) { 
        // if result code 100 is received 
        // means user edited/deleted product 
        // reload this screen again 
        Intent intent = getIntent(); 
        finish(); 
        startActivity(intent); 
       } 

      } 

      /** 
      * Background Async Task to Load all product by making HTTP Request 
      * */ 
      class LoadAlldetails extends AsyncTask<String, String, String> { 

       /** 
       * Before starting background thread Show Progress Dialog 
       * */ 
       @Override 
       protected void onPreExecute() { 
        super.onPreExecute(); 
        pDialog = new ProgressDialog(New_Login.this); 
        pDialog.setMessage("Logging you in. Please wait..."); 
        pDialog.setIndeterminate(false); 
        pDialog.setCancelable(true); 
        pDialog.show(); 
       } 

       /** 
       * getting user details from url 
       * */ 
       protected String doInBackground(String... args) { 

        cd = new ConnectionDetector(getApplicationContext()); 

        String storedEmail = Appconfig.stored_user_name.toString(); 
        String stroedPW = Appconfig.stored_password.toString(); 
        // Check if Internet present 
        if (!cd.isConnectingToInternet()) 
        { 

         if((inputEmail.toString()==storedEmail)&&(inputPassword.toString()==stroedPW)) 
         { 
          // Launch Dashboard Screen 
          Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class); 

          // Close all views before launching Dashboard 
          dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
          startActivity(dashboard); 
         } 


        } 

        // Importing all assets like buttons, text fields 
        inputEmail = (EditText) findViewById(R.id.loginEmail); 
        inputPassword = (EditText) findViewById(R.id.loginPassword); 

        //Auto fill for login only if the user has logged in before 
        if((Appconfig.stored_user_name.length()>0)&&(Appconfig.stored_password.length()>0)) 
        { 
         inputEmail.setText(Appconfig.stored_user_name.toString()); 
         inputPassword.setText(Appconfig.stored_password.toString()); 



        } 


        // Importing all assets like buttons, text fields 

        btnLogin = (Button) findViewById(R.id.btnLogin); 
        btnLinkToRegister = (Button) findViewById(R.id.btnLinkToRegisterScreen); 
        loginErrorMsg = (TextView) findViewById(R.id.login_error); 


        // Login button Click Event 
        btnLogin.setOnClickListener(new View.OnClickListener() { 

         public void onClick(View view) { 

          new LoadAlldetails().execute(); 

          String email = inputEmail.getText().toString(); 

          String password = inputPassword.getText().toString(); 
          UserFunctions userFunction = new UserFunctions(); 
          Log.d("Button", "Login"); 
          JSONObject json = userFunction.loginUser(email, password); 





          //Check to see if user has put in details 
          if ((email.matches("")||(password.matches("")))) 
          { 
          loginErrorMsg.setText("Please enter your details "); 
          } 

          else 
          { //Checks to see if first time in the app 
           // launces gcm activity 
           if (Appconfig.GCMactivity == false) { 
            Intent intent = new Intent(); 
            intent.setClass(getApplicationContext(),RegisterForGCMActivity.class); 
            startActivity(intent); 
            //set to true so GCm register wont show again 
            Appconfig.GCMactivity=true; 



            } 
           else{ 
          // check for login response 
          try { 
           if (json.getString(KEY_SUCCESS) != null) { 
            loginErrorMsg.setText(""); 
            String res = json.getString(KEY_SUCCESS); 
            if(Integer.parseInt(res) == 1){ 
             // user successfully logged in 
             // Store user details in SQLite Database 
             DatabaseHandler db = new DatabaseHandler(getApplicationContext()); 
             JSONObject json_user = json.getJSONObject("user"); 
             Appconfig.stored_user_name=json_user.getString(KEY_EMAIL); 
             Appconfig.stored_password = password; 




             if(Appconfig.email_is_set==false) 
             { 
              Appconfig.student_ID = json_user.getString(KEY_STUDENT_ID); 
             } 
             Appconfig.email_is_set=true; 

             // 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 
             Intent dashboard = new Intent(getApplicationContext(), DashboardActivity.class); 

             // Close all views before launching Dashboard 
             dashboard.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
             startActivity(dashboard); 

             // Close Login Screen 
             finish(); 


            }else{ 
             // Error in login 
             loginErrorMsg.setText("Incorrect username/password"); 
            } 
           } 




          } catch (JSONException e) { 
           e.printStackTrace(); 
          } 
         } 
         }}}); 
         GCMFlag = true; 


        // Link to Register Screen 
        btnLinkToRegister.setOnClickListener(new View.OnClickListener() { 

         public void onClick(View view) { 
          Intent i = new Intent(getApplicationContext(), 
            RegisterActivity.class); 
          startActivity(i); 
          finish(); 
         } 
        }); 
        return null; 
       } 

       public boolean isLoggedIn(){ 
        return pref.getBoolean(IS_LOGIN, false); 
       } 
      } 



       /** 
       * After completing background task Dismiss the progress dialog 
       * **/ 
       protected void onPostExecute(String file_url) { 
        // dismiss the dialog after getting user details 
        pDialog.dismiss(); 
        // updating UI from Background Thread 
        runOnUiThread(new Runnable() { 
         public void run() { 

         } 
        }); 

       } 

      } 
+0

什麼是您所遇到的問題? – codeMagic

+0

所以當我點擊我的登錄按鈕時沒有任何反應 –

+0

我沒有看到你在哪裏調用任務,所以請指出。我同時在回答中寫了一些筆記。 – codeMagic

回答

1

我看到很多到目前爲止,我會讓你知道這些,但知道有可能更多。

首先,您從背景Thread撥打startActivity,因此您需要爲其添加Context。由於其內部類的Activity你可以使用

New_Login.this.startActivity(dashboard); 

但是,你應該將數據返回給onPostExecute()和剛剛從那裏開始的Activity

我看到的另一件事是你試圖從背景Thread更新Views這是一個不是。您不應該嘗試在doInBackground()中更新它們。

您正在嘗試比較String小號正確

if((inputEmail.toString()==storedEmail)&&(inputPassword.toString()==stroedPW)) 

應該

if((inputEmail.toString().equals(storedEmail))&&(inputPassword.toString().equals(stroedPW))) 

它看起來像你宣佈你的View在你AsyncTask但這應該在做你的Activity(最有可能在onCreate()onResume()

不要你除非絕對必要,否則請參閱getApplicationContext()。在onClick()的內部,您可以使用v.getContext()以及Activity的內部,但在聽衆的外部可以使用ActivitiyName.this(這裏有更多選項,但現在我會保持這種簡單)。

我的建議,去掉你的AsyncTask並讓你的Activity設置正確,然後執行你的AsyncTask。並且一定要仔細閱讀文檔。

Activity Docs

AsyncTask Docs

+0

我會說在onPreExecute中創建一個對話框就好了嗎? – cYrixmorten

+0

@cYrixmorten我在哪裏說它不好? – codeMagic

+0

'看起來你是在你的AsyncTask中聲明你的視圖'..當我讀到它時,也認爲你也指這個。 – cYrixmorten