【问题标题】:Update ProgressDialog from Thread inside Service从服务内部的线程更新 ProgressDialog
【发布时间】:2013-08-27 22:44:09
【问题描述】:

我想从服务中的线程增加一个进度对话框,我很难做到这一点,这是我的代码,请帮助我。

我尝试了许多不同的方法,包括 asyncTask(我遇到了上下文问题) 并尝试使用静态功能,但无法正常工作, 我是android新手,请在这里解释一下问题。

活动

public class MainActivity extends Activity {

ProgressDialog progressBar;

private void showProgrssBar() {

    progressBar.show();
}

private void dismissProgressBar() {

    progressBar.dismiss();
}

private void increaseProgressBar(int total) {

    progressBar.incrementProgressBy(total);
};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
     createProgressBarDialog();

Intent n = new Intent(this, myService.class);
startService(n);

}

private void createProgressBarDialog()
{
    progressBar = new ProgressDialog(this);
    progressBar.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    progressBar.setMax(200);
    progressBar.setMessage("Recieving bluetooth data");
    progressBar.setCanceledOnTouchOutside(false);
}

服务:

 public class myService extends Service
{

    private myThread myThread;

    Handler handler = new Handler()
    {
        @Override
        public void handleMessage(android.os.Message msg) 
        {
            int total = msg.getData().getInt("total");

            if (total == -1)
            {
                dismissProgressBar();
            }
            else if (total == 0)
            {
                showProgrssBar();
            }
            else
            {
                increaseProgressBar(total);
            }       
        }   
    };

            @Override
            public int onStartCommand(Intent intent, int flags, int startId)
            {
                myThread = new myThread(handler);
                myThread.start();

                return START_STICKY;
            }

线程

  class myThread extends Thread
    { 
         Handler h;
    int numOfLinesToRead = 220;
    int line = 0;


    public myThread(Handler h)
    {
        this.h = h;
    }

    private void increaseProgressBarOnActivity(int i_MsgType)
    {
         Message msg = h.obtainMessage();
         Bundle b = new Bundle();
         b.putInt("total", i_MsgType);
         msg.setData(b);
         h.sendMessage(msg);
    }

    @Override
    public void run() {
        super.run();
        int increase;
        try
        {
            Thread.sleep(1);
        }
        catch (InterruptedException e)
        {

            e.printStackTrace();
        }
          for (; line < 220; line++) 
            {
               increase = (line*100/numOfLinesToRead);
                if (increase != 0)
                {
                    increaseProgressBarOnActivity(increase);   
                    try
                    {
                        Thread.sleep(90);
                    }
                    catch (InterruptedException e)
                    {

                        e.printStackTrace();
                    }

                }
            }

    }
}

【问题讨论】:

    标签: android multithreading android-asynctask android-service android-context


    【解决方案1】:

    尽管您已经尝试过 AsyncTask,但我仍然强烈建议您使用它。

    看看onProgressUpdate() 方法。它用于从 AsyncTask 更新 UI。

    以下是它的外观示例:

    private class DownloadFilesTask extends AsyncTask<String, Integer, Long> {
    
        private ProgressDialog progressBar;
    
        @Override
        protected void onPreExecute(){ 
           super.onPreExecute();
           progressBar= new ProgressDialog(getApplicationContext());
           progressBar.setMessage("Loading...");
           progressBar.show();    
        }
    
        protected Long doInBackground(String... params) {
    
           long someLong;
           // do something here with params
    
           // the Integer variable is used for progress
           publishProgress(i);
           // call it for example while downloading a file
    
           return someLong;
        }
    
        // this is called whenever you call puhlishProgress(Integer)
        protected void onProgressUpdate(Integer... progress) {
             progressBar.incrementProgressBy(progress[0]);
        }
    
        // the onPostexecute method receives the return type of doInBackGround()
        protected void onPostExecute(Long result) {
           // do something with the result
           progressBar.dismiss();
       }
    }
    

    你说你的问题是获取上下文。好吧:ServiceContext

    因此您可以简单地将 AsyncTask 设为 Service 的内部类,然后使用其 Context。

    【讨论】:

    • 嗨,我的进度由服务内的线程控制,我该怎么办?将服务上下文传递给线程?
    • 另一个问题,你是说服务是一个上下文,它怎么可能在服务上下文上显示 UI\进度条而不是 ui 线程......我说的对吗?
    • 既然你提到了它,你也可以看看IntentService。它是为在 UI 线程上执行异步操作而设计的。 mobile.tutsplus.com/tutorials/android/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多