Skip to content

Commit e0938ff

Browse files
committed
Android多线程
1 parent 957728d commit e0938ff

29 files changed

+1398
-63
lines changed

app/src/main/AndroidManifest.xml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,19 @@
9292
<activity
9393
android:name=".recycle.WaterFallActivity"
9494
android:screenOrientation="portrait" />
95+
<activity
96+
android:name=".multiThread.ThreadPoolActivity"
97+
android:screenOrientation="portrait" />
98+
<activity
99+
android:name=".multiThread.HandlerThreadActivity"
100+
android:screenOrientation="portrait" />
101+
<activity
102+
android:name=".multiThread.IntentServiceActivity"
103+
android:screenOrientation="portrait" />
104+
105+
<service
106+
android:name=".multiThread.intentService.MyIntentService"
107+
android:screenOrientation="portrait" />
95108
</application>
96109

97110
</manifest>

app/src/main/java/org/ninetripods/mq/study/BaseActivity.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,10 @@ public boolean onCreateOptionsMenu(Menu menu) {
6464
//清除缓存
6565
menuItem.setTitle("清除缓存");
6666
break;
67+
case 2:
68+
//清除缓存
69+
menuItem.setTitle("BLOG");
70+
break;
6771
}
6872
}
6973
return super.onCreateOptionsMenu(menu);
@@ -90,13 +94,21 @@ public boolean onOptionsItemSelected(MenuItem item) {
9094
//清除缓存
9195
clearCache();
9296
break;
97+
case 2:
98+
//打开webview
99+
openWebview();
100+
break;
93101
}
94102
return true;
95103
default:
96104
return super.onOptionsItemSelected(item);
97105
}
98106
}
99107

108+
public void openWebview() {
109+
110+
}
111+
100112
@Override
101113
public void onClick(View v) {
102114

app/src/main/java/org/ninetripods/mq/study/MainActivity.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@
66
import android.support.v4.app.Fragment;
77
import android.support.v4.app.FragmentManager;
88
import android.support.v4.app.FragmentTransaction;
9+
import android.support.v4.view.GravityCompat;
910
import android.support.v4.widget.DrawerLayout;
1011
import android.support.v7.app.ActionBarDrawerToggle;
1112
import android.support.v7.widget.Toolbar;
12-
import android.view.Gravity;
1313
import android.view.MenuItem;
1414

1515
import org.ninetripods.mq.study.util.fragment.HomeFragment;
16-
import org.ninetripods.mq.study.util.fragment.OtherFragment;
16+
import org.ninetripods.mq.study.util.fragment.MultiThreadFragment;
1717
import org.ninetripods.mq.study.util.fragment.PopFragment;
1818
import org.ninetripods.mq.study.util.fragment.ProcessFragment;
1919
import org.ninetripods.mq.study.util.fragment.RecycleFragment;
@@ -41,7 +41,7 @@ public void initViews() {
4141
navigationView = (NavigationView) findViewById(R.id.navigation_view);
4242
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, drawer_layout, toolbar, 0, 0);
4343
drawerToggle.syncState();
44-
selectItem(3);
44+
selectItem(4);
4545
}
4646

4747
@Override
@@ -66,7 +66,7 @@ public boolean onNavigationItemSelected(@NonNull MenuItem item) {
6666
selectItem(4);
6767
break;
6868
}
69-
drawer_layout.closeDrawer(Gravity.START);
69+
drawer_layout.closeDrawer(GravityCompat.START);
7070
return true;
7171
}
7272
});
@@ -112,7 +112,7 @@ private Fragment getFragment(int pos) {
112112
currentFragment = new RecycleFragment();
113113
break;
114114
case 4:
115-
currentFragment = new OtherFragment();
115+
currentFragment = new MultiThreadFragment();
116116
break;
117117
default:
118118
currentFragment = new HomeFragment();
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
package org.ninetripods.mq.study.multiThread;
2+
3+
4+
import android.os.Handler;
5+
import android.os.HandlerThread;
6+
import android.os.Looper;
7+
import android.os.Message;
8+
import android.support.v7.widget.Toolbar;
9+
import android.view.View;
10+
import android.widget.TextView;
11+
12+
import org.ninetripods.mq.study.BaseActivity;
13+
import org.ninetripods.mq.study.CommonWebviewActivity;
14+
import org.ninetripods.mq.study.R;
15+
import org.ninetripods.mq.study.util.Constant;
16+
17+
import java.util.Random;
18+
19+
import static android.os.Build.VERSION.SDK;
20+
import static android.os.Build.VERSION.SDK_INT;
21+
22+
public class HandlerThreadActivity extends BaseActivity {
23+
24+
private HandlerThread handlerThread;
25+
private Handler mainHandler;
26+
private Handler uiHandler;
27+
private static final int MSG_UPDATE = 1;
28+
private static final int UI_UPDATE = 3;
29+
private TextView tv_random, tv_start, tv_pause;
30+
private volatile boolean isStop = false;
31+
32+
@Override
33+
public void setContentView() {
34+
setContentView(R.layout.activity_handler_thread);
35+
}
36+
37+
@Override
38+
public void initViews() {
39+
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
40+
initToolBar(toolbar, "HandlerThread", true, true, 2);
41+
tv_random = (TextView) findViewById(R.id.tv_random);
42+
tv_start = (TextView) findViewById(R.id.tv_start);
43+
tv_pause = (TextView) findViewById(R.id.tv_pause);
44+
handlerThread = new HandlerThread("handler_thread");
45+
handlerThread.start();
46+
//在主线程初始化,传入的是HandlerThread中的Looper
47+
mainHandler = new Handler(handlerThread.getLooper()) {
48+
@Override
49+
public void handleMessage(Message msg) {
50+
//Handler是在HandlerThread所在的子线程线程中处理Message
51+
switch (msg.what) {
52+
case MSG_UPDATE:
53+
if (isStop) return;
54+
try {
55+
//更新UI
56+
String result = String.valueOf(new Random().nextInt(9000) + 1000);
57+
sendMsg(UI_UPDATE, result, uiHandler);
58+
//延迟3秒
59+
Thread.sleep(2000);
60+
//循环发送消息
61+
mainHandler.sendEmptyMessage(MSG_UPDATE);
62+
} catch (InterruptedException e) {
63+
e.printStackTrace();
64+
}
65+
break;
66+
}
67+
}
68+
};
69+
//在主线程初始化,传入的是主线程中的Looper
70+
uiHandler = new Handler(Looper.getMainLooper()) {
71+
@Override
72+
public void handleMessage(Message msg) {
73+
//在主线程中处理Message
74+
switch (msg.what) {
75+
case UI_UPDATE:
76+
//更新验证码
77+
String result = (String) msg.obj;
78+
tv_random.setText(result);
79+
break;
80+
}
81+
}
82+
};
83+
}
84+
85+
@Override
86+
public void initEvents() {
87+
tv_start.setOnClickListener(this);
88+
tv_pause.setOnClickListener(this);
89+
}
90+
91+
@Override
92+
public void onClick(View v) {
93+
switch (v.getId()) {
94+
case R.id.tv_start:
95+
isStop = false;
96+
//发消息给子线程 在子线程中或得验证码
97+
sendMsg(MSG_UPDATE, mainHandler);
98+
toast("开始获取验证码");
99+
break;
100+
case R.id.tv_pause:
101+
isStop = true;
102+
toast("暂停获取验证码");
103+
break;
104+
}
105+
}
106+
107+
/**
108+
* 发送消息
109+
*
110+
* @param what message.what
111+
* @param handler Handler
112+
*/
113+
private void sendMsg(int what, Handler handler) {
114+
Message message = Message.obtain();
115+
message.what = what;
116+
handler.sendMessage(message);
117+
}
118+
119+
/**
120+
* 发送消息
121+
*
122+
* @param what message.what
123+
* @param handler Handler
124+
* @param result message.obj
125+
*/
126+
private void sendMsg(int what, String result, Handler handler) {
127+
Message message = Message.obtain();
128+
message.what = what;
129+
message.obj = result;
130+
handler.sendMessage(message);
131+
}
132+
133+
@Override
134+
protected void onDestroy() {
135+
if (SDK_INT >= 18) {
136+
handlerThread.quitSafely();
137+
} else {
138+
handlerThread.quit();
139+
}
140+
super.onDestroy();
141+
}
142+
143+
@Override
144+
public void openWebview() {
145+
CommonWebviewActivity.webviewEntrance(this, Constant.HANDLER_THREAD_BLOG);
146+
}
147+
}
Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,126 @@
1+
package org.ninetripods.mq.study.multiThread;
2+
3+
import android.content.Intent;
4+
import android.support.v7.widget.Toolbar;
5+
import android.view.Gravity;
6+
import android.view.LayoutInflater;
7+
import android.view.View;
8+
import android.view.ViewGroup;
9+
import android.widget.ProgressBar;
10+
import android.widget.TextView;
11+
12+
import org.ninetripods.mq.study.BaseActivity;
13+
import org.ninetripods.mq.study.CommonWebviewActivity;
14+
import org.ninetripods.mq.study.R;
15+
import org.ninetripods.mq.study.multiThread.intentService.MyIntentService;
16+
import org.ninetripods.mq.study.multiThread.intentService.UpdateUIReceiver;
17+
import org.ninetripods.mq.study.popup.PopupWindow.CommonPopupWindow;
18+
import org.ninetripods.mq.study.util.CommonUtil;
19+
import org.ninetripods.mq.study.util.Constant;
20+
import org.ninetripods.mq.study.util.DpUtil;
21+
22+
public class IntentServiceActivity extends BaseActivity implements CommonPopupWindow.ViewInterface {
23+
24+
25+
private TextView tv_start_one, tv_start_two;
26+
private CommonPopupWindow popupWindow;
27+
private ProgressBar pb_one, pb_two;
28+
private TextView tv_progress_one, tv_progress_two;
29+
30+
@Override
31+
public void setContentView() {
32+
setContentView(R.layout.activity_itent_service);
33+
}
34+
35+
@Override
36+
public void initViews() {
37+
receiver.register(this);
38+
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
39+
initToolBar(toolbar, "IntentService", true, true, 2);
40+
tv_start_one = (TextView) findViewById(R.id.tv_start_one);
41+
tv_start_two = (TextView) findViewById(R.id.tv_start_two);
42+
}
43+
44+
@Override
45+
public void initEvents() {
46+
tv_start_one.setOnClickListener(this);
47+
tv_start_two.setOnClickListener(this);
48+
}
49+
50+
@Override
51+
public void onClick(View v) {
52+
Intent intent = new Intent(IntentServiceActivity.this, MyIntentService.class);
53+
switch (v.getId()) {
54+
case R.id.tv_start_one:
55+
intent.setAction(MyIntentService.ACTION_ONE);
56+
startService(intent);
57+
break;
58+
case R.id.tv_start_two:
59+
intent.setAction(MyIntentService.ACTION_TWO);
60+
startService(intent);
61+
break;
62+
}
63+
showPopupWindow();
64+
}
65+
66+
@Override
67+
protected void onDestroy() {
68+
receiver.unRegister(this);
69+
super.onDestroy();
70+
}
71+
72+
//BroadcastReceiver用来更新UI
73+
private UpdateUIReceiver receiver = new UpdateUIReceiver() {
74+
@Override
75+
public void UpdateUI(int type, int progress) {
76+
switch (type) {
77+
case 0:
78+
//更新第一个进度
79+
if (tv_progress_one == null || pb_one == null) return;
80+
tv_progress_one.setText(String.valueOf(progress + "%"));
81+
pb_one.setProgress(progress);
82+
break;
83+
case 1:
84+
//更新第二个进度
85+
if (tv_progress_two == null || pb_two == null) return;
86+
tv_progress_two.setText(String.valueOf(progress + "%"));
87+
pb_two.setProgress(progress);
88+
break;
89+
}
90+
}
91+
};
92+
93+
public void showPopupWindow() {
94+
if (popupWindow != null && popupWindow.isShowing()) return;
95+
View upView = LayoutInflater.from(this).inflate(R.layout.intent_service, null);
96+
//测量View的宽高
97+
CommonUtil.measureWidthAndHeight(upView);
98+
popupWindow = new CommonPopupWindow.Builder(this)
99+
.setView(R.layout.intent_service)
100+
.setWidthAndHeight(ViewGroup.LayoutParams.WRAP_CONTENT, upView.getMeasuredHeight())
101+
.setBackGroundLevel(0.7f)//取值范围0.0f-1.0f 值越小越暗
102+
// .setAnimationStyle(R.style.AnimUp)
103+
.setViewOnclickListener(this)
104+
.create();
105+
popupWindow.showAtLocation(findViewById(android.R.id.content), Gravity.TOP, 0, (int) DpUtil.dp2px(this, 150));
106+
}
107+
108+
@Override
109+
public void getChildView(View view, int layoutResId) {
110+
switch (layoutResId) {
111+
case R.layout.intent_service:
112+
tv_progress_one = (TextView) view.findViewById(R.id.tv_progress_one);
113+
tv_progress_two = (TextView) view.findViewById(R.id.tv_progress_two);
114+
pb_one = (ProgressBar) view.findViewById(R.id.pb_one);
115+
pb_one.setProgress(0);
116+
pb_two = (ProgressBar) view.findViewById(R.id.pb_two);
117+
pb_two.setProgress(0);
118+
break;
119+
}
120+
}
121+
122+
@Override
123+
public void openWebview() {
124+
CommonWebviewActivity.webviewEntrance(this, Constant.INTENT_SERVICE_BLOG);
125+
}
126+
}

0 commit comments

Comments
 (0)