0

コードを実行しようとすると、メイン トーストのみが実行されます。進行状況ダイアログとその他のトースト メッセージが実行されていません。

XMLファイルを追加する必要がありましたか(textViewとButtonのみが含まれています)。これを解決するのを手伝ってください。ありがとう

package com.example.asyncexample;

import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.Toast;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;


    public class MainActivity extends Activity {


ProgressDialog progressBar;
int prorgessInc = 1;            // incrementing the progress dialog

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Button button = (Button) findViewById(R.id.start_button);
    button.setOnClickListener(startTaskListener);
    }


private OnClickListener startTaskListener =  new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
    Context context = getApplicationContext();

    progressBar = new ProgressDialog(v.getContext());

    BackgroundTask test = new BackgroundTask(); 

        test.execute(context);

        CharSequence text = "Main Thread is Running";
        int duration = Toast.LENGTH_LONG;
        Toast toast = Toast.makeText(context, text, duration);
        toast.show();
    }
};

private class BackgroundTask extends AsyncTask<Context, Integer, String>{
    protected void OnPreExecute() {
        CharSequence msg = "BackgroundTask is Operating";
        progressBar.setCancelable(true);
        progressBar.setMessage(msg);
        progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressBar.setProgress(0);
        progressBar.setMax(100);
        progressBar.show();

    }

    @Override
    protected String doInBackground(Context... params) {
        //BackgroundTask Is Running
        for(int i =0; i<=100; i+=prorgessInc){
            try {Thread.sleep(100);}
        catch (InterruptedException e) { e.printStackTrace();}

            publishProgress(prorgessInc);

            if(isCancelled()) break;
            }

        return getString(R.string.backgndcompld);
    }

    protected void OnProgressUpdate(Integer...values ) {
            //Update Progress bar
        progressBar.incrementProgressBy(prorgessInc);

    }

    protected void PostExecute(String result){
        //Dissmiss progressbar 
        progressBar.dismiss();

        Context context = getApplicationContext();
        int duration  = Toast.LENGTH_LONG;
        Toast toast2 = Toast.makeText(context, result, duration);
        toast2.show();
    }

}
}       
4

1 に答える 1

1

そうです、問題は AsyncTask のメソッドの命名にあります。

以下を定義しました。

  • protected void OnPreExecute()
  • protected void OnProgressUpdate()
  • protected void PostExecute()

ただし、実際の方法は次のとおりです。

  • 保護された無効 onPreExecute()
  • 保護された無効 onProgressUpdate()
  • protected void onPostExecute()

大文字と小文字の違いに注意してください。以下の as を使用していた場合@Override、IDE はそれを示している可能性があります。

私はそれとあなたのコードの他の部分をきれいにしました。見てみましょう:

public class MainActivity
        extends Activity
        implements View.OnClickListener
{

    private Button button;
    private ProgressDialog progressBar;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_example);
        button = (Button) findViewById(R.id.start_button);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v)
    {
        Log.d("click", "start button clicked, starting task");
        BackgroundTask test = new BackgroundTask();
        test.execute();
    }

    private class BackgroundTask
            extends AsyncTask<Void, Integer, String>
    {

        int PROGRESS_INCREMENT = 1;
        int PROGRESS_MAX = 100;
        String DIALOG_MSG = "AsyncTask is Operating";

        @Override
        protected void onPreExecute()
        {
            progressBar = new ProgressDialog(getApplicationContext());
            progressBar.setCancelable(true);
            progressBar.setMessage(DIALOG_MSG);
            progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
            progressBar.setProgress(0);
            progressBar.setMax(PROGRESS_MAX);
            progressBar.show();
        }

        @Override
        protected String doInBackground(Void... params)
        {
            for (int i = 0; i <= 100; i += PROGRESS_INCREMENT)
            {
                try
                {
                    Thread.sleep(100);
                }
                catch (InterruptedException e)
                {
                    e.printStackTrace();
                }
                publishProgress(PROGRESS_INCREMENT);
                if (this.isCancelled())
                {
                    break;
                }
            }
            return "[some result text]";
        }

        @Override
        protected void onProgressUpdate(Integer... values)
        {
            progressBar.incrementProgressBy(PROGRESS_INCREMENT);
        }

        @Override
        protected void onPostExecute(String result)
        {
            progressBar.dismiss();
            Toast.makeText(getApplicationContext(),
                            result,
                            Toast.LENGTH_LONG)
                            .show();
        }
    }
}

主な変更点:

  • Activity は View.OnClickListener を実装しているため、 onClick() メソッドを Activity に移動して、匿名の内部クラスを排除できます。
  • ボタンはクラス レベルのスコープに移動しました。リスナーで定義すると、エラーが発生しやすくなります。
  • onPreExecute() メソッドから PrgressDialog を準備して表示します。それがそのためです。
  • トーストをクリーンアップしました。これらすべての変数を使用したり、無駄なオブジェクトでスペースを浪費したりする必要はありません。
  • トースト メッセージの代わりに、組み込みのログをデバッグ メッセージに使用します。トースト メッセージはすぐに画面にスパムを送信し始める可能性があり、表示の長さのために、いつ何が起こったのかを知るのは非常に不正確です。
于 2014-05-31T18:15:00.510 に答える