gpt4 book ai didi

android - 从服务内的线程更新 ProgressDialog

转载 作者:行者123 更新时间:2023-11-30 03:24:45 27 4
gpt4 key购买 nike

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

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

Activity

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

}
}

}
}

最佳答案

Despite you having already tried AsyncTask, I still would strongly recommend to use it.

只需看一下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 设为您服务的内部类,然后使用它的 Context。

关于android - 从服务内的线程更新 ProgressDialog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18427263/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com