シミュレーションマルチスレッドダウンロード

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
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