android线程控制进度条

对于安卓单机版的音乐播放器,实现进度条非常容易,通过MediaPlayer对象直接可以得到播放的进度,但是对于远程控制的音乐播放器来说则不是那么回事了,常用的办法是先远程获得MediaPlayer对应的音乐播放总时间,然后在本地对这个总时间进行处理。那么常用的“暂停/播放”、“快进/快退”等都需要把他们放到线程里作处理。

************************************************************

//程序完整代码

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class Media_Player2Activity extends Activity {
 /** Called when the activity is first created. */
 private SeekBar testBar;
 ThreadTest r = null;
 Thread t = new Thread(r);
 private Button btn1;
 private Button btn2;
 private Button btn3;

 private int isPlay = 0;
 
 private int status=0;
 
 private int operate=-1;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);
  testBar = (SeekBar) findViewById(R.id.testBar);

  btn1 = (Button) findViewById(R.id.btn1);//点击btn1结算线程并重新开始
  btn2 = (Button) findViewById(R.id.btn2);//点击btn2结算线程并重新开始
  btn3 = (Button) findViewById(R.id.btn3);//点击btn3暂停/开始线程
  btn1.setOnClickListener(

  new Button.OnClickListener() {
   public void onClick(View v) {

    if (!t.isInterrupted()) {
     t.interrupt();
     if (r != null) {
      r.shutDown();
      r = null;
     }
     t = null;
    }
    r = new ThreadTest(1);
    t = new Thread(r);
    t.start();

    for (int i = 0; i < 100; i++) {
     Log.v("i", i + "");
    }

   }
  }

  );

  btn2.setOnClickListener(

  new Button.OnClickListener() {
   public void onClick(View v) {

    if (!t.isInterrupted()) {
     t.interrupt();
     if (r != null) {
      r.shutDown();
      r = null;
     }
     t = null;
    }
    r = new ThreadTest(1);
    t = new Thread(r);
    t.start();
   }
  }

  );

  btn3.setOnClickListener(

  new Button.OnClickListener() {
   public void onClick(View v) {

    if (isPlay == 0) {
     if(t!=null)
     {
      if (!t.isInterrupted()) {
       t.interrupt();
       if (r != null) {
        r.shutDown();
        r = null;
       }
       t = null;
      }
     }
     
     isPlay=1;

    } else {
     if(t!=null)
     {
      if (!t.isInterrupted()) {
       t.interrupt();
       if (r != null) {
        r.shutDown();
        r = null;
       }
       t = null;
      }
     }
     r = new ThreadTest(0);
     t = new Thread(r);
     t.start();
     isPlay=0;
    }

   }
  }

  );
 }

 class ThreadTest implements Runnable {
  private boolean flag = true;
  int i = 0;
  
  public ThreadTest(int operate)
  {
   if(operate==1)
   {
    //根据operate判断进度条是继续执行还是重新开始
    status=0;
   }
  }

  public void run() {
   // TODO Auto-generated method stub
   while (flag) {
    try {
     testBar.setProgress(status);
     try {
      testBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
       public void onProgressChanged(SeekBar seekBar,
         int progress, boolean fromUser) {
        // TODO Auto-generated method stub
        if (fromUser) {
         Log.v("this is from user",
           "this is from user");
         status=seekBar.getProgress();
        }
       }

       public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        Log.v("onStartTrackingTouch",
          "onStartTrackingTouch");
       }

       public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub
        Log.v("seekBar.getProgress:",
          seekBar.getProgress() + "");
        i = seekBar.getProgress();
       }

      });
      Thread.sleep(1000);
     } catch (InterruptedException e) {
      e.printStackTrace();
      Thread.currentThread().interrupt();
     }
     status++;

    } catch (Exception e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
  }

  public void shutDown() {
   Log.v("has stopped", "has stopped");
   flag = false;
  }
 }
}

************************************************************

//xml代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
   
    <Button android:id="@+id/btn1" android:text="按钮1" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
    <Button android:id="@+id/btn2" android:text="按钮2" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
    <Button android:id="@+id/btn3" android:text="按钮3" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
    <SeekBar android:id="@+id/testBar" android:layout_width="fill_parent" android:layout_height="wrap_content"/>
</LinearLayout>

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Android中,进度条(ProgressBar)通常用于显示任务的执行状态或数据的加载进度。动态加载通常是当后台操作正在运行,比如网络请求、文件读取等,用户界面需要展示一个反馈,让用户知道系统并没有冻结。 以下是使用Android组件实现动态加载进度条的步骤: 1. **在布局中添加进度条**: 在XML布局文件中,添加一个`ProgressBar`控件,例如: ```xml <ProgressBar android:id="@+id/progressBar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminate="true" /> <!-- indeterminate设置为true表示进度不可预知 --> ``` 2. **在Activity或Fragment中引用并初始化**: 在对应的Java或Kotlin类中找到`ProgressBar`并初始化它: ```java ProgressBar progressBar = findViewById(R.id.progressBar); ``` 3. **启动加载操作时显示进度条**: 当开始加载之前,将进度条的`visibility`属性设为`VISIBLE`,显示进度条: ```java progressBar.setVisibility(View.VISIBLE); ``` 4. **更新进度(可选)**: 如果有可用的进度更新,可以通过`setProgress()`方法改变进度条的位置,但大部分时候我们使用的是不可预知的进度,所以这一步不常用。 5. **完成加载后隐藏进度条**: 当后台操作完成,将进度条设为`GONE`或`INVISIBLE`,隐藏进度条: ```java progressBar.setVisibility(View.GONE); ``` 6. **处理可能的异常**: 加载操作完成后,最好处理可能出现的异常情况,确保无论成功与否都能正确地隐藏进度条。 相关问题: 1. 如何在Android中异步加载数据并显示进度? 2. 如何使用Handler或Callback在主线程和子线程之间同步进度更新? 3. 如何避免进度条在任务结束时还在闪动?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值