2017-09-13 2 views
-1

Unten ist eine Login-Aktivität, die sich mit dem Server verbindet, um eine Login-Operation durchzuführen, also im Hintergrund-Thread, wie man die Methoden von Asynctask richtig benutzt?Android: Wie Asynctask für diese unter Klasse korrekt zu implementieren?

Ich bin neu in Android und nicht AsyncTask bevor verwendet, aber ich habe Tutorials noch gesehen konnte es selbst nicht tun

// public class LoginActivity erstreckt AppCompatActivity erstreckt AsyncTask einige Fehler

Bearbeiten zeigt: Fehler ist hier // public class LoginActivity erstreckt AsyncTask AppCompatActivity erstreckt {({erwartet)

public class LoginActivity extends AppCompatActivity{ 


private TextView tvLFS, tvOr; 
private Button btnLog; 
private EditText etUn, etPw; 
private static final String TAG = "LoginActivity"; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_login); 

    //remove action bar 
    ActionBar actionBar = getSupportActionBar(); 
    if (actionBar != null) { 
     actionBar.hide(); 
    } 

    //change font of the heading 
    tvLFS = (TextView) findViewById(R.id.tvHeadingLFS); 
    Typeface typeface = 

    Typeface.createFromAsset(getAssets(), 
    "fonts/futuramediumitalicbt.ttf"); 
    tvLFS.setTypeface(typeface); 

    init(); 
} 

private void init() { 
    tvLFS = (TextView) findViewById(R.id.tvHeadingLFS); 
    tvOr = (TextView) findViewById(R.id.tvOR_LOGIN_USING); 
    btnLog = (Button) findViewById(R.id.btnLogin); 
    etUn = (EditText) findViewById(R.id.etUName); 
    etPw = (EditText) findViewById(R.id.etPass); 


    /* SharedPreferences pref = getSharedPreferences("ActivityPREF", 
    Context.MODE_PRIVATE); 
    SharedPreferences.Editor edt = pref.edit(); 
    edt.putBoolean("activity_executed", true); 
    edt.commit();*/ 


    btnLog.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      try { 

       final String usname = etUn.getText().toString(); 
       final String uspass = etPw.getText().toString(); 


       final LoginRequest loginRequest = new LoginRequest(); 
       loginRequest.setClientType("mobile"); 
       loginRequest.setMsService("login"); 
       loginRequest.setMsServiceType("user-management"); 
       List<LoginRequest.MsDataLogin> msDataLogList = new 
    ArrayList<>(); 
       LoginRequest.MsDataLogin msData = 
    loginRequest.getMsDAtaLoginInstance(); 
       msData.setUserName(usname); 
       msData.setUserPass(uspass); 
       msDataLogList.add(msData); 
       loginRequest.setMsData(msDataLogList); 


    RestClient.getApiInterface().postData(loginRequest).enqueue(new 
    ResponseResolver<LoginResponse>(LoginActivity.this) { 
        @Override 
        public void success(LoginResponse loginResponse) { 

         if (loginResponse.getErrorCode().equals("0")) 
    { 
          Toast.makeText(LoginActivity.this, 
    "Logged-in successfully!!", Toast.LENGTH_SHORT).show(); 
          Intent in = new 
    Intent(getApplicationContext(), MainActivity.class); 
          startActivity(in); 
          finish(); 
         } else 
    if(loginResponse.getErrorCode().equals("1")){ 
          Toast.makeText(LoginActivity.this, "No 
    account found!! Please register", Toast.LENGTH_LONG).show(); 
         } 

        } 


        @Override 
        public void failure(APIError error) { 

         Log.d(TAG, "failure: error-- 
    "+error.getMessage()); 

        } 
       }); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       } 
      } 
     }); 
    } 


    } 
+0

Sie müssen den Fehler veröffentlichen, wenn Sie möchten, dass wir Ihnen helfen – Ivan

+0

Ich habe mit Fehler bearbeitet, ich denke, Syntax ist falsch, aber nicht sicher – Suhas

Antwort

1

arbeitet Basierend auf Sie bearbeiten, Sie versuchen, zwei Klassen zu erweitern? Nun, (ich denke) das ist in Java nicht möglich ...

Zurück zu Ihrer Frage zu AsyncTask. AsynTask wird gemacht, um eine Aufgabe außerhalb des Hauptthreads/UI-Threads zu machen, für einige Szenarien (zB: das Grundlegende, nicht die UI sperren während man etwas Arbeit macht), aus diesem Grund kann man nicht mit der UI in einer AsyncTask oder gar interagieren mischen Sie beide Dinge (ist in einigen Fällen möglich, aber nicht empfohlen).

So müssen Sie AsyncTask in anderen Klasse als Ihre Ansicht/Aktivität (eine andere Class.java oder verschachtelte/interne Klasse) zu erstreckt, beispielsweise unter:

public class MyAsyncTask extends AsyncTask<ParameterType, ProgressType, ReturnType> { 

    //Example to demonstrate UI interation 
    private IView view; 

    public MyAsyncTask(IView view) { 
     this.view = view; 
    } 

    @Override 
    protected ReturnType doInBackground(ParameterType... params) { 
     // do and update the work 
     return new ReturnType(); // work is done, return the result 
    } 

    // Override this method if you need to do something after the AsyncTask has finished (based on the return). Here you can interact with the UI too. 
    @Override 
    protected void onPostExecute(ReturnType o) { 
     // Example of UI interaction 
     view.updateUI(o); 
    } 
} 

Wenn Sie nicht benötigen Parameter, Returns oder Wenn Sie den Fortschritt Ihrer AsyncTask aktualisieren, können Sie den Typ "Void" anstelle von ParameterType, ProgressType oder ReturnType verwenden.

Dann können Sie einen Eingang von MyAsyncTask in anderen Klassen (zB: Ihre Aktivität) einen Aufruf 'execute()' Methode zum Starten der AsyncTask erstellen.

public class Foobar extends AppCompatActivity implements IView { 
    ... code ... 
    MyAsyncTask fooTask = new MyAsyncTask(this); // Foobar class needs to implement IView interface 
    fooTask.execute(parameters); // execute AsyncTask with 'parameters' 
    ... code ... 
} 

Anhand Ihres Codes versuchen Sie, einen Netzwerkanruf zu tätigen. Sie müssen also Ihren Netzwerkaufruf in die Methode 'doInBackground' migrieren und die nächste Aktivität (oder den Fehler) in 'onPostExecute' aufrufen.

Ich bin nicht sehr vertraut mit Ihrer Implementierung (RestClient, ResponseResolver), aber ich denke, Sie können Retrofit/Jackson-Bibliotheken für eine festere Lösung verwenden. Sie sind nicht sehr schwer zu verstehen und machen Netzwerkanrufe einfacher.

In den folgenden Referenzen gibt es andere Alternativen, die Sie anstelle einer AsyncTask verwenden können. Hier

ist einige Referenzen:

https://developer.android.com/reference/android/os/AsyncTask.html https://developer.android.com/guide/components/processes-and-threads.html

Gute Codierung.

+0

Ich habe noch eine Frage! Jetzt muss ich die Eingabe von edittexts (d. h. usname und uspass) wie man es in doInBackground als params übergeben? so dass ich Ruheoperation innerhalb doInBackgroud machen kann – Suhas

+0

Sie können die Eingabe übergeben (get String von EditTexts) als Variablen der AsyncTask (übergeben Sie den Konstruktor, Setter) oder verwenden Sie String (oder eine Map/HashMap) als ParameterType (wenn Sie nicht vertraut mit "Typ ... Variable" Notation, das heißt eine optionale "Vektor" Variable [Argument/Parameter], so akzeptiert Null oder mehr Werte. Doc: http://docs.oracle.com/javase/tutorial/ java/javaOO/arguments.html # varargs), so dass Sie den Methodenaufruf "execute()" direkt übergeben können. – YoshioMYH

1

Verwenden Sie eine nur extends Wort

public class LoginActivity extends AsyncTask, AppCompatActivity{ 

anstelle Ihres:

public class LoginActivity extends AsyncTask extends AppCompatActivity{ 

Lassen Sie mich wissen, ob es für Sie

Verwandte Themen