AsynTask gebruiken om de voortgangsbalk te tonen tijdens een poging om SSH naar server te sturen

First of all, i have to state that i am new to Java in general & Android. I do however have the basics, or at least getting there.

Het doel van mijn applicatie: bij het bedrijf hebben we een externe server waar we SSH naar toe kunnen en werken we wat. Soms is de server onbereikbaar en verstoort daarom ons werk.

Mijn toepassing is verondersteld om het volgende te doen:

1- Als ik Jsch, i SSH naar de server gebruik en als er een antwoord is, dan probeer ik het over 15 minuten opnieuw, als er geen reactie is, wil ik dit melden.

Ik heb met succes het bovenstaande gedaan in de niet-Android-versie van Java, en was in staat om het te doen in de Android-versie, echter op de belangrijkste thread, dus ik kan niets updaten in de gebruikersinterface. In essentie is de voortgangsbalk .. In de normale versie bevriest de gebruikersinterface en in de onderstaande AsyncTask-versie. ik krijg een uitzondering zodra ik op de knop druk

Hieronder is de code die ik gebruik, om eerlijk te zijn, ik lees helemaal over dat de beste oplossing AsyncTask is, maar sinds ik nieuw ben, weet ik niet zeker of mijn fout is. Ik ga er eerlijk vanuit dat het mogelijk in het AsyncTask en AsyncTask is.

Ik weet niet zeker wat ik daar moet gebruiken ... Hieronder is mijn code, hopelijk kan iemand op mijn fout wijzen.

package com.example.myapp;

import java.io.IOException;

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.HandlerThread;
import android.os.StrictMode;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.os.Handler;

public class VedasServerMonitorActivity extends Activity {
    /** Called when the activity is first created. */


    Button button;
    EditText IP;
    EditText UserName;
    EditText Password;
    EditText Port;
    ProgressBar progressBar1;

    String UserStr;
    String PassStr;
    String IPStr;
    int PortInt;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        button = (Button) findViewById(R.id.button1);
        IP = (EditText) findViewById(R.id.serverIp);
        UserName = (EditText) findViewById(R.id.userName);
        Password = (EditText) findViewById(R.id.password);
        Port = (EditText) findViewById(R.id.port);
        progressBar1 = (ProgressBar) findViewById(R.id.progressBar1);

        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder()
                .permitAll().build();

        StrictMode.setThreadPolicy(policy);

        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {



                new asyncTaskUpdateProgress().execute();

            }

        });

    }

    public class asyncTaskUpdateProgress extends AsyncTask {



        @Override
        protected void onPostExecute(Void result) {
           //TODO Auto-generated method stub







        }

        @Override
        protected void onPreExecute() {
           //TODO Auto-generated method stub
            progressBar1.setVisibility(View.VISIBLE);
            UserStr = UserName.getText().toString();
            PassStr = Password.getText().toString();
            IPStr = IP.getText().toString();
            PortInt = Integer.parseInt(Port.getText().toString());

            button.setClickable(true);
            progressBar1.setVisibility(View.INVISIBLE);



        }

        @Override
        protected void onProgressUpdate(Void... values) {
           //TODO Auto-generated method stub
            progressBar1.setVisibility(View.INVISIBLE);

        }

        @Override
        protected Void doInBackground(Void... arg0) {
            boolean ok = false;


try {


            SSHTest sshtest = new SSHTest();
            ok = sshtest.sshconnect(UserStr, PassStr, IPStr, PortInt);
            }

        catch (Exception e) {
                e.printStackTrace();
                Log.i("ERROR HERE", "doInBackground: IOException");}
if (ok) {

     Toast.makeText(getApplicationContext(),
     "Connection Susccessfull", Toast.LENGTH_LONG)
     .show();

} else {

     Toast.makeText(getApplicationContext(),
     "Unable to connect", Toast.LENGTH_LONG).show();
     notify(getApplicationContext(), true);

}
return null;


        }


        protected void notify(Context context, Boolean on) {
            NotificationManager nm = (NotificationManager) context
                    .getSystemService(Context.NOTIFICATION_SERVICE);
            ComponentName comp = new ComponentName(context.getPackageName(),
                    getClass().getName());
            Intent intent = new Intent().setComponent(comp);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 0,
                    intent, Intent.FLAG_ACTIVITY_NEW_TASK);
            Notification n = new Notification(R.drawable.warning, "Message",
                    System.currentTimeMillis());
            n.setLatestEventInfo(context, "Vedas Server Monitor",
                    "Port Un-rechable", pendingIntent);
            nm.notify(22, n);
        }

    }

}

android × 194760

0

2 antwoord

Er zijn enkele correcties die u moet aanbrengen in de doInBackground() . Maar daarvoor een kleine uitleg over het AsyncTask .

AsyncTask is used when you have any non-UI back ground activity to perform. The function onPreExecute() is used to show any UI action (in most cases its showing of a dialog) before you enter the background thread. The function doInBackground() is used to perform the non-ui action (in most cases fetching data from server). While doing the background activity in doInBackground() you may wish to show some progress which you do by using publishProgress() which will internally call the onProgressUpdate() method. On completion of the background activity in doInBackground() you return the result of the activity, if you have any. After you return from the doInBackground() method internally there is call made to the onPostExecute() which will receive the result you have returned in doInBackground() as a parameter. Now onPostExecute() will run on a UI thread enmost of the UI action like dismissing of dialog which was shown in onPreExecute(), displaying the result on some UI component etc. happens in this method.

Nu naar de fout die je in je code doet: U toont een toast of een notificatie op basis van het resultaat van uw servergegevens ophalen met behulp van een functie verwittigen maar u bent nog steeds niet op de achtergrond -ui draad. Nu moet dit resultaat idealiter worden geretourneerd en gecontroleerd in de onPostExecute() en op basis van de waarde kunt u de UI-component van toast of notificatie weergeven .

Ik hoop dat deze uitleg je helpt bij het oplossen van je probleem.

Bewerken

In uw geval omdat u de booleaanse type resultaatvariabele ok naar opPostExecute() kunt verzenden. Daarvoor moet u de volgende wijzigingen aanbrengen:

in klassenverklaring:

public class asyncTaskUpdateProgress extends AsyncTask

en

protected void onPostExecute(Boolean result){
if (ok) {

 Toast.makeText(getApplicationContext(),
 "Connection Susccessfull", Toast.LENGTH_LONG)
 .show();

} else {

 Toast.makeText(getApplicationContext(),
 "Unable to connect", Toast.LENGTH_LONG).show();
 notify(getApplicationContext(), true);

}
}

enfinally in

protected Void doInBackground(Void... arg0) {
        boolean ok = false;


try {


        SSHTest sshtest = new SSHTest();
        ok = sshtest.sshconnect(UserStr, PassStr, IPStr, PortInt);
        }

    catch (Exception e) {
            e.printStackTrace();
            Log.i("ERROR HERE", "doInBackground: IOException");}

return ok;

 }
1
toegevoegd
Terwijl u een AsyncTask uitbreidt, geeft u de 3 parameters op zoals AsyncTask waarbij Params het parametertype is dat u naar de doInBackground() , Voortgang is het parameter type dat u naar de onProgressUpdate() stuurt en Result is voor de onPreExecute() .
toegevoegd de auteur Arun George, de bron
Controleer mijn bewerkt bericht.
toegevoegd de auteur Arun George, de bron
Arun, bedankt, je uitleg op hoog niveau helpt echt. mijn enige probleem is echter om de code te lezen:) ... ik ben een nieuweling, maar uit wat je zei over toast en notificatie, als ik ze voorlopig becommentarieer, zou het dan nog steeds de voortgangsbalk weergeven? Het andere probleem waar ik moeite mee heb, is wat ik moet doen en hoe? voorbeeld: beschermd Void doInBackground (Void ... arg0) zou ik het leeg laten ... args0? (dit is waar ik ook verdwaal
toegevoegd de auteur First Major, de bron
Ik zal dat proberen en terugkomen met de resultaten. Bedankt voor de steun. Zeer nuttig en duidelijk, ik begrijp nu het AsyncTask dankzij u
toegevoegd de auteur First Major, de bron
Dichterbij komen, alleen probleem met protected Void doInBackground (Void ... arg0) {........... return ok; wat een ongeldig retourtype is.
toegevoegd de auteur First Major, de bron
ok, ik veranderde de Void doInBackground (Void ... arg0) in Boolean doInBackground (Void ... arg0) {Maar ik kreeg een uitzondering met handlers, geplakt onder 06-24 22: 08: 29.717: WARN/Systeem .err (13570): java.lang.RuntimeException: kan handler niet maken in thread die niet heeft aangeroepen Looper.prepare() com.example.myapp.VedasServerMonitorActivity $ asyncTaskUpdate & zwnj; Progress .......... .. & zwnj; ...............
toegevoegd de auteur First Major, de bron
Arun, ik heb het aan het werk. Hier zijn de veranderingen gedaan. Ik moest de beschermde leegte onPostExecute (Boolean-resultaat) {if (ok) {veranderen in een resultaat onPostExecute (Boolean-resultaat) {if (resultaat) {en ik verwijderde ook de SSHTest sshtest = nieuwe SSHTest (); van de protectedBoolean doInBackground (Void ... arg0) {`naar globale variabele, het werkt allemaal goed, nu hoef ik alleen maar de voortgangsbalk uit te zetten als het proces is voltooid, of er nu verbinding is of niet. Bedankt dat je steun enorm was
toegevoegd de auteur First Major, de bron

You can try this
in your protected void onPreExecute()
need to add

progressBar = new ProgressDialog(v.getContext());
        progressBar.setCancelable(true);
        progressBar.setMessage("File downloading ...");
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressBar.setProgress(0);
        progressBar.setMax(100);
        progressBar.show();

        //reset progress bar status
        progressBarStatus = 0;

dan

protected void onProgressUpdate(Void... values) {  
    progressBarStatus= progressBarStatus + x;//x means any value
       progressBar.setProgress(progressBarStatus);

    }



after that you need to finish your progressBar in onPostExecute(). like

protected void onPostExecute(Void result) {
        progressBar.dismiss();
}
1
toegevoegd