package cn.androidy.thinking;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.ActionBar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import com.bumptech.glide.load.engine.executor.FifoPriorityThreadPoolExecutor;
import com.example.android.common.activities.SampleActivityBase;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Random;
import cn.androidy.logger.core.Log;
import cn.androidy.logger.core.LogWrapper;
import cn.androidy.logger.core.MessageOnlyLogFilter;
import cn.androidy.logger.view.LogFragment;
import cn.androidy.thinking.concurrent.PrioritizedRunnable;
import cn.androidy.thinking.concurrent.ThreadJob;
import cn.androidy.thinking.concurrent.ThreadResultConsumer;
/**
* Created by Rick Meng on 2015/6/16.
*/
public class ThreadPoolDemoActivity extends SampleActivityBase implements View.OnClickListener, ThreadResultConsumer, View.OnLongClickListener {
public static final String TAG = "ThreadPoolDemoActivity";
// Whether the Log Fragment is currently shown
private boolean mLogShown;
private ActionBar mActionBar;
private FloatingActionButton mFloatingActionButton;
private ArrayList<Integer> mFloatingActionButtonImageResIdList;
private int mCurrentColorIndex = 0;
private FifoPriorityThreadPoolExecutor fifoPriorityThreadPoolExecutor;
private Random r;
private ThreadJob mLastJob;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_threadpooldemo);
mActionBar = getSupportActionBar();
mActionBar.setDisplayHomeAsUpEnabled(true);
mFloatingActionButton = (FloatingActionButton) findViewById(R.id.floatingActionButton);
mFloatingActionButton.setOnClickListener(this);
mFloatingActionButton.setOnLongClickListener(this);
mFloatingActionButtonImageResIdList = new ArrayList<Integer>();
mFloatingActionButtonImageResIdList.add(R.drawable.ic_add_white_48dp);
mFloatingActionButton.setImageResource(mFloatingActionButtonImageResIdList.get(mCurrentColorIndex));
mCurrentColorIndex = (mCurrentColorIndex + 1) % mFloatingActionButtonImageResIdList.size();
r = new Random();
final int cores = Math.max(1, getAvailableProcessors());
fifoPriorityThreadPoolExecutor = new FifoPriorityThreadPoolExecutor(cores);
}
private String createThreadName() {
GregorianCalendar calendar = new GregorianCalendar();
int h = calendar.get(Calendar.HOUR_OF_DAY);
int m = calendar.get(Calendar.MINUTE);
int s = calendar.get(Calendar.SECOND);
int ms = calendar.get(Calendar.MILLISECOND);
return h + ":" + m + ":" + s + "." + ms;
}
public static int getAvailableProcessors() {
return Runtime.getRuntime().availableProcessors();
}
/**
* Create a chain of targets that will receive log data
*/
@Override
public void initializeLogging() {
// Wraps Android's native log framework.
LogWrapper logWrapper = new LogWrapper();
// Using Log, front-end to the logging chain, emulates android.util.log method signatures.
Log.setLogNode(logWrapper);
// Filter strips out everything except the message text.
MessageOnlyLogFilter msgFilter = new MessageOnlyLogFilter();
logWrapper.setNext(msgFilter);
// On screen logging via a fragment with a TextView.
LogFragment logFragment = (LogFragment) getSupportFragmentManager()
.findFragmentById(R.id.log_fragment);
msgFilter.setNext(logFragment.getLogView());
Log.i(TAG, "Ready");
Log.i(TAG, "系统支持最大线程数:" + String.valueOf(ThreadJob.getAvailableProcessors()));
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_demo_detail, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
int id = v.getId();
switch (id) {
case R.id.floatingActionButton:
mLastJob = new ThreadJob(fifoPriorityThreadPoolExecutor, this);
mLastJob.start(new PrioritizedRunnable(mLastJob, createThreadName(), r.nextInt(100)));
mCurrentColorIndex = (mCurrentColorIndex + 1) % mFloatingActionButtonImageResIdList.size();
break;
}
}
@Override
public void onJobComplete(ThreadJob job) {
Log.i(TAG, job.printRunnableInfo());
}
@Override
public void onJobCanceled(ThreadJob job) {
Log.i(TAG, job.printRunnableInfo() + "--->取消");
}
@Override
public boolean onLongClick(View v) {
if (mLastJob != null) {
mLastJob.cancel();
return true;
}
return false;
}
}