2014-12-18 72 views
1

我目前正在嘗試實現一個線程示例到我的項目中,我想將用戶輸入的用戶名和密碼傳入線程,以便在帳戶存在時檢測到它或不,但我在正確實施它時遇到困難。任何幫助將不勝感激。Android:傳遞字符串到asyncTask

這是我收到的錯誤之一。

類 'checkPassword2' 必須聲明爲抽象或實現抽象方法>'doInBackground(參數...)在 '的AsyncTask'

包com.example.liam.ca3;

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.text.Editable; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.ProgressBar; 
import android.os.AsyncTask; 


public class LoginScreen extends Activity { 

    private final static String TAG = "Sleep"; 

    private static final String defName = "admin"; 
    private static final String defPassword = "admin1"; 
    private ProgressBar mProgressBar; 



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

     mProgressBar = (ProgressBar) findViewById(R.id.progressBar); 


     final EditText uname = (EditText) findViewById(R.id.username_edittext); 
     final EditText passwd = (EditText) findViewById(R.id.password_edittext); 

     final Button loginButton = (Button) findViewById(R.id.login_button); 
     loginButton.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View v) { 
       new checkPassword2().execute(uname, passwd); 


       if (checkPassword(uname.getText(), passwd.getText())) { 
        Log.i("8", "accepted password"); 
        // Create an explicit Intent for starting the HelloAndroid Activity 
        Intent startApp = new Intent(LoginScreen.this, 
          MainActivity.class); 

        // Use the Intent to start the HelloAndroid Activity 
        startActivity(startApp); 

       } else { 
        Log.i("8", "failed password"); 
        uname.setText(""); 
        passwd.setText(""); 
       } 
      } 
     }); 
    } 

    private boolean checkPassword(Editable uname, Editable passwd) { 

     Log.i("2", uname.toString()); 
     Log.i("2", passwd.toString()); 

     if(uname.toString().equalsIgnoreCase(defName) && passwd.toString().equalsIgnoreCase(defPassword)) 
     { 
      Log.i("8", "this should work"); 
      return true; 
     } 
     Log.i("8", "this shouldn't work"); 
     return false; 
    } 

    private class checkPassword2 extends AsyncTask<Integer, Integer, String> { 
     protected int doInBackground(String... values) { 
      int result = 0; 

      String nameTry = values[0]; 
      String passTry = values[1]; 

      if(nameTry.equalsIgnoreCase(defName) && passTry.equalsIgnoreCase(defPassword)) 
      { 
       Log.i("8", "this should work"); 
       result = 1; 
      } 
      else { 
       Log.i("8", "this shouldn't work"); 
       result = 2; 
      } 

      for (int i = 1; i < 11; i++) { 
       sleep(); 
       publishProgress(i * 10); 
      } 
      return result; 
     } 

     protected void onProgressUpdate(Integer... progress) { 
      mProgressBar.setProgress(progress[0]); 
     } 

     protected void onPostExecute(Long result) { 
      mProgressBar.setVisibility(ProgressBar.INVISIBLE); 
     } 

     private void sleep() { 
      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       Log.e(TAG, e.toString()); 
      } 
     } 
    } 

} 
+0

你的參數順序錯誤。 'doInBackground()'獲得類定義中的第一個參數。另外,'onPostExecute()'應該除了一個'Integer'而不是'Long'以及你擁有它的方式。 – codeMagic 2014-12-18 22:18:12

回答

3

看一看文檔:http://developer.android.com/reference/android/os/AsyncTask.html

當你擴展的AsyncTask,你需要指定三個泛型:

  • params爲傳遞給doInBackground參數的類型()
  • 進度是傳遞給onProgressUpdate()和publishProgress()的參數的類型
  • 結果是參數的類型傳遞給onCancelled()和onPostExecute(),並且是doInBackground的返回類型()

在代碼中,有聲明的泛型類型和參數的類型不匹配。你的泛型是 「整數,整數,字符串」:

  • PARAMS =整數
  • 進展=整數
  • 結果=字符串

現在讓我們來看看你的代碼...

doInBackground(String... values) 

Misatch:它預計整數參數,您指定字符串參數。但你確實返回一個Integer。

onPostExecute(Long result) 

不匹配:它預計整數參數,您指定長參數。

確保方法中的類型遵守泛型子句中指定的類型,並且一切都應該正常。

+0

非常感謝,我事先查看了文檔,但最終讓我對這個過程感到困惑,但是你解釋它的方式確實有幫助。我還有一個問題,因爲我不確定如何將用戶定義的名稱和密碼傳遞給線程。 'new checkPassword2()。execute(uname,passwd);' – Liam 2014-12-18 22:34:18

+0

首先,您必須將第一個泛型(Params)的類型更改爲String。其次,在'doInBackground(String ... values)'方法中,你應該首先檢查'values'的長度是2('values.length == 2'),然後用戶名是'values [0]'並且密碼是'values [1]'。 – 2014-12-18 22:39:06

+0

我在自己的代碼中實現了自己的一般想法,但這是對線程的初始調用,證明這很困難。它指出:'不能解析方法'執行(android.widget.EditText,android.widget.EditText)'' – Liam 2014-12-18 22:45:14

相關問題