0

まず第一に、私はJava全般とAndroidが初めてであることを述べなければなりません。しかし、私は基本を持っているか、少なくともそこにたどり着いています。

私のアプリケーションの目的: 会社には、SSH で接続するリモート サーバーがあり、いくつかの作業を行っています。場合によっては、サーバーに到達できず、作業が中断されることがあります。

私のアプリケーションは、次のことを行うと想定されています。

1- Jsch を使用してサーバーに SSH 接続し、応答があれば 15 分後に再試行します。応答がない場合は通知します。

Android以外のバージョンのJavaで上記を正常に実行し、Androidバージョンで実行できましたが、メインスレッドで実行できたため、UIで何も更新できません。要するにプログレス バーです。通常バージョンでは UI がフリーズし、以下に示す AsyncTask バージョンではフリーズします。ボタンを押すとすぐに例外が発生します

以下は私が使用しているコードです。正直なところ、最善の解決策はAsyncTaskであることを読みましたが、私はそれが初めてなので、間違っているかどうかはわかりません。正直なところ、 AsyncTask と AsyncTask にある可能性があると思います。

そこで何を使用すればよいかわかりません...以下は私のコードです。誰かが私の間違いを指摘してくれることを願っています。

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<Void, Void, Void> {



        @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);
        }

    }

}

アンドロイド×194760

4

2 に答える 2

1

追加
する必要がある場合は、これを試すことができますprotected void onPreExecute()

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;

それから

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

    }



その後、progressBar を で終了する必要がありますonPostExecute()。お気に入り

protected void onPostExecute(Void result) {
        progressBar.dismiss();
}
于 2012-06-24T08:00:03.763 に答える
1

で行う必要があるいくつかの修正がありますdoInBackground()。しかし、その前にAsyncTask.

AsyncTask実行する非 UI バックグラウンド アクティビティがある場合に使用されます。この関数onPreExecute()は、バックグラウンド スレッドに入る前に、UI アクション (ほとんどの場合、ダイアログの表示) を表示するために使用されます。この関数doInBackground()は、UI 以外のアクション (ほとんどの場合、サーバーからデータをフェッチする) を実行するために使用されます。でバックグラウンド アクティビティを実行しているときに、メソッドを内部的に呼び出すdoInBackground()を使用して進行状況を表示したい場合があります。バックグラウンド アクティビティが完了すると、アクティビティの があればそれを返します。メソッドから内部的に戻った後、パラメータとして返された を受け取るへの呼び出しが行われます。今publishProgress()onProgressUpdate()doInBackground()resultdoInBackground()onPostExecute()resultdoInBackground()onPostExecute()は UI スレッドで実行され、 に示されているダイアログを閉じる、一部の UI コンポーネントにonPreExecute()を表示するなどのほとんどの UI アクションは、このメソッドで発生します。result

コードで行っている間違いについて:関数を使用したサーバー データ フェッチの結果に基づいてatoastまたは aを表示していますが、まだバックグラウンドの非 UI スレッドにいます。この結果は理想的には返され、 でチェックされ、その値に基づいてまたはの UI コンポーネントを表示できます。notificationnotifyonPostExecute()toastnotification

この説明が問題の解決に役立つことを願っています。

編集

あなたの場合、ブール型の結果変数okをに送信できるためですonPostExecute()。そのためには、次の変更を行う必要があります。

クラス宣言で:

public class asyncTaskUpdateProgress extends AsyncTask<Void, Void, Boolean>

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);

}
}

そして最後に

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;

 }
于 2012-06-24T07:24:36.627 に答える