シミュレーションマルチスレッドダウンロード
4698 ワード
質問:単一スレッドが今遅い問題と、ネット上で他の人のマルチスレッドダウンロードの例を見て、自分でマルチスレッドダウンロードの小例を書いた.
Cpuはタイムスライスごとにスレッドを呼び出すため、マルチスレッドはより多くのタイムスライスを得ることができ、スレッドがIO操作を行うと、スレッドがcpu操作を行うなどのリソースの利用率を高めることができる.
本明細書では、管理スレッドloader threadが複数のダウンロードスレッドdown threadsのダウンロードを担当し、複数のスレッドのデータをUIスレッドにリアルタイムで表示するUI(main)thread制御インタフェースを仮定する.問題を簡単にするために、ダウンロードスレッドが1つのデータをダウンロードするたびに、down threadsごとにダウンロードするデータ量lenが同じであると仮定します.
以下の問題を解決します.
a)loader threadはダウンロードしたデータを一定時間ごとにUIインタフェースに表示する.UIインタフェースはUIスレッドだけが制御と設定できるため、loader threadはUIスレッドを通じてインタフェースを制御し、メッセージメカニズムで通信を実現し、リアルタイムでメッセージ(message)を通じてUI threadにデータを送る.
b)down threadsがダウンロードしたデータサイズはsharepreferencesで保存し、ダウンロードするたびにsharepreferencesからダウンロード済み、今回ダウンロードしたデータ量を取得し、>lenであるか否かを判断し、フラグセットを完了する
.今回ダウンロードしたデータをloader threadに保存します
コード:
mainactivity
本稿では,リスナーが好ましいと考え,コールバック関数と同様に,コールバック関数では関数ポインタをパラメータとして用い,転送された関数に基づいて対応する方法を呼び出す.ここではインタフェース,インタフェースをパラメータとして,対応するインタフェースメソッドを呼び出す.
Android簡易ボディの方法:
2つ目:内部クラスをリスナーとして使用
3つ目:Activity自体がイベントリスナーの具体的なコードとして使用されます.http://download.csdn.net/detail/surpassgood123/7685375
Cpuはタイムスライスごとにスレッドを呼び出すため、マルチスレッドはより多くのタイムスライスを得ることができ、スレッドがIO操作を行うと、スレッドがcpu操作を行うなどのリソースの利用率を高めることができる.
本明細書では、管理スレッドloader threadが複数のダウンロードスレッドdown threadsのダウンロードを担当し、複数のスレッドのデータをUIスレッドにリアルタイムで表示するUI(main)thread制御インタフェースを仮定する.問題を簡単にするために、ダウンロードスレッドが1つのデータをダウンロードするたびに、down threadsごとにダウンロードするデータ量lenが同じであると仮定します.
以下の問題を解決します.
a)loader threadはダウンロードしたデータを一定時間ごとにUIインタフェースに表示する.UIインタフェースはUIスレッドだけが制御と設定できるため、loader threadはUIスレッドを通じてインタフェースを制御し、メッセージメカニズムで通信を実現し、リアルタイムでメッセージ(message)を通じてUI threadにデータを送る.
b)down threadsがダウンロードしたデータサイズはsharepreferencesで保存し、ダウンロードするたびにsharepreferencesからダウンロード済み、今回ダウンロードしたデータ量を取得し、>lenであるか否かを判断し、フラグセットを完了する
.今回ダウンロードしたデータをloader threadに保存します
コード:
mainactivity
private Handler handler = new Handler()//UI handler
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
switch (msg.what) {
case 1:
int num=msg.getData().getInt("size");
String str=" :"+num;
text2.setText(str);
break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button=(Button) findViewById(R.id.button1);
text2=(TextView) findViewById(R.id.textView2);
text2.setText(" :");
button.setOnClickListener(new MyButton());
download(99);//
}
private void download(final int sum)// loader thread
{
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
FileDownloader loader=new FileDownloader(sum,3,MainActivity.this);//3 ,
try {
loader.download(new DownloadProgressListener() {// , UI
@Override
public void onDownloadSize(int size) {
// TODO Auto-generated method stub
Message msg=new Message();
msg.what=1;
msg.getData().putInt("size", size);
handler.sendMessage(msg);//
}});
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }).start();
}
傍受インタフェースjava: public interface DownloadProgressListener {
public void onDownloadSize(int size);
}
loader threaddコードFileDownloader.java FileDownloader(int size,int threadnum,Context context)
{
this.size=size;
this.threadnum=threadnum;
threads=new DownThread[threadnum];
this.context=context;
SharedPreferences userInfo = context.getSharedPreferences("user_info", 0);
Editor editor=userInfo.edit();
for(int i=0;i
down threadコードDownThread.java public DownThread(FileDownloader loader,int len,Context context,int num)
{
this.loader=loader;
this.len=len;
this.context=context;
this.num=num;
}
/* i */
private int getprocess(int i)
{
SharedPreferences userInfo = context.getSharedPreferences("user_info", 0);
int value=userInfo.getInt("thread"+i,0);
return value;
}
private void saveprocess(int i,int size)
{
SharedPreferences userInfo = context.getSharedPreferences("user_info", 0);
Editor editor=userInfo.edit();
editor.putInt("thread"+i,size);
editor.commit();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(!finished)
{
//int size=(int) (Math.random()*10);
int size=1;
int cnt=getprocess(num);
cnt+=size;
saveprocess(num,cnt);
loader.append(size);
if(cnt>=len)
{
finished=true;
break;
}
}
}
本稿では,リスナーが好ましいと考え,コールバック関数と同様に,コールバック関数では関数ポインタをパラメータとして用い,転送された関数に基づいて対応する方法を呼び出す.ここではインタフェース,インタフェースをパラメータとして,対応するインタフェースメソッドを呼び出す.
Android簡易ボディの方法:
findViewById(R.id.myButton).setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Do stuff
}
});
2つ目:内部クラスをリスナーとして使用
3つ目:Activity自体がイベントリスナーの具体的なコードとして使用されます.http://download.csdn.net/detail/surpassgood123/7685375