【问题标题】:Cannot run the async example ..?无法运行异步示例..?
【发布时间】:2014-05-31 17:38:22
【问题描述】:

当我尝试运行代码时,只有主 toast 正在运行。进度对话框和其他 toast 消息没有运行。这个程序是睡眠进程的简单异步示例。主要问题是它没有显示进度对话框。

我是否需要添加 xml 文件(它只包含一个 textView 和一个按钮)。 请帮我解决这个问题。谢谢

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

}
}       

【问题讨论】:

    标签: android android-asynctask android-activity android-background


    【解决方案1】:

    对,你的问题在于 AsyncTask 的方法命名。

    你已经定义了:

    • 受保护的无效 OnPreExecute()
    • 受保护的无效 OnProgressUpdate()
    • 受保护的无效 PostExecute()

    然而真正的方法是:

    • 受保护的 void onPreExecute()
    • 受保护的无效 onProgressUpdate()
    • 受保护的 void onPostExecute()

    注意大小写的区别。如果您使用下面的@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。这就是它的用途。
    • 清理了您的 Toast。无需使用所有这些变量并将空间浪费在无用的对象上。
    • 使用内置日志代替 Toast 消息来获取调试消息。 Toast 消息很快就会开始在您的屏幕上发送垃圾邮件,并且由于显示长度非常不准确,无法准确了解事情何时发生。

    【讨论】:

    • 谢谢..这对我真的很有帮助。我的问候。
    猜你喜欢
    • 2018-01-29
    • 2011-12-06
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-03
    相关资源
    最近更新 更多