先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7
深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
正文
}
}
//代码添加
package com.recycler.zx.zxrecyclerview.fragments;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.recycler.zx.zxrecyclerview.R;
public class FragmentsCodeActivity extends AppCompatActivity {
ContentFragment contentFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_fragments_code);
addContentLayout();
}
//t通过代码添加fragment
private void addContentLayout() {
FragmentManager fm = getFragmentManager();
//开启一个事务
FragmentTransaction ft = fm.beginTransaction();
contentFragment = new ContentFragment();
//添加fragment
ft.add(R.id.frameLayout_content,contentFragment);
//ft.remove();
// ft.replace();替换,先删除,再添加
ft.commit();//提交事务
}
}
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.recycler.zx.zxrecyclerview.fragments.FragmentsCodeActivity">
<fragment
android:layout_width="0dp"
android:id="@+id/fragment_title"
android:layout_weight="1"
android:name="com.recycler.zx.zxrecyclerview.fragments.TitleFragment"
android:layout_height="match_parent"/>
<FrameLayout
android:id="@+id/frameLayout_content"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="match_parent"/>
7.Fragment出入栈操作和 官方推荐传递参方法
package com.recycler.zx.zxrecyclerview.fragments;
import android.app.FragmentTransaction;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import com.recycler.zx.zxrecyclerview.R;
public class PopBackTaskActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_pop_back_task);
}
public void one(View v){
PopBacksFragment popBacksFragment = PopBacksFragment.getInstance("one");
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.ft_content,popBacksFragment);
//把当前fragment添加到Activity栈
ft.addToBackStack(null);
ft.commit();
}
public void two(View v){
PopBacksFragment popBacksFragment = PopBacksFragment.getInstance("two");
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.ft_content,popBacksFragment);
//把当前fragment添加到Activity栈
ft.addToBackStack(null);
ft.commit();
}
//点返回键的时候,判断栈中是否存在,存在就做出栈操作
//比activity性能要高一些
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK) {
//如果返回栈里面没有了
if(getFragmentManager().getBackStackEntryCount() == 0) {
finish();
} else {
getFragmentManager().popBackStack();//出栈,不进行退出操作
}
return true;
}
return super.onKeyDown(keyCode, event);
}
}
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android=“http://schemas.android.com/apk/res/android”
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.recycler.zx.zxrecyclerview.fragments.PopBackTaskActivity">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="one"
android:onClick="one"
android:id="@+id/button2"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="two"
android:onClick="two"
android:id="@+id/button3"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<FrameLayout
android:id="@+id/ft_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_centerHorizontal="true"
android:layout_below="@+id/button2"></FrameLayout>
package com.recycler.zx.zxrecyclerview.fragments;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.recycler.zx.zxrecyclerview.R;
/**
- A simple {@link Fragment} subclass.
*/
public class PopBacksFragment extends Fragment {
private static final String TITLE = “title”;
private String title ;
public PopBacksFragment(){}
// public PopBacksFragment(String title) {
// this.title =title;
// }
//fragment的标准传参数方法,这样传参数的时候屏幕旋转数据不会消失,(并且Fragment是不允许使用有参的构造方法的)
public static PopBacksFragment getInstance(String title){
PopBacksFragment pf = new PopBacksFragment();
Bundle bundle = new Bundle();
bundle.putString(TITLE,title);
pf.setArguments(bundle);
return pf;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_pop_backs, container, false);
TextView tvPop = (TextView) v.findViewById(R.id.tv_pop);
tvPop.setText(getArguments().getString(TITLE));
return v;
}
}
8.fragment和activity交换数据
//把数据从MenuFragment 传递到 MainFragment
package com.recycler.zx.zxrecyclerview.fragments.fragmentAndActivity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import com.recycler.zx.zxrecyclerview.R;
public class FramentAndActivity extends AppCompatActivity implements MenuFragment.MyMenuListener {
private MenuFragment menuFragment;
private MainFragment mainFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_frament_and);
menuFragment = (MenuFragment) getFragmentManager().findFragmentById(R.id.menu_fragment);
mainFragment = (MainFragment) getFragmentManager().findFragmentById(R.id.main_frament);
}
@Override
public void changeValue(String value) {
mainFragment.setTvValue(value);
}
}
package com.recycler.zx.zxrecyclerview.fragments.fragmentAndActivity;
import android.app.Activity;
import android.app.Fragment;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import com.recycler.zx.zxrecyclerview.R;
/**
- A simple {@link Fragment} subclass.
*/
public class MenuFragment extends Fragment {
private MyMenuListener mMyMenuListener;
public MenuFragment() {
// Required empty public constructor
}
@Override
public void onAttach(Activity context) {
super.onAttach(context);
mMyMenuListener = (MyMenuListener) context;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View v = inflater.inflate(R.layout.fragment_menu, container, false);
Button news = (Button) v.findViewById(R.id.news);
Button music = (Button) v.findViewById(R.id.music);
news.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMyMenuListener.changeValue("news");
}
});
music.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMyMenuListener.changeValue("music");
}
});
return v;
}
//定义一个回调接口,要求宿主(包含它的Activity)去实现它
public static interface MyMenuListener{
public void changeValue(String value);
}
}
package com.recycler.zx.zxrecyclerview.fragments.fragmentAndActivity;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.recycler.zx.zxrecyclerview.R;
import butterknife.Bind;
import butterknife.ButterKnife;
/**
- A simple {@link Fragment} subclass.
*/
public class MainFragment extends Fragment {
@Bind(R.id.tv_value)
TextView tvValue;
public MainFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.fragment_main, container, false);
ButterKnife.bind(this, view);
return view;
}
public void setTvValue(String value){
tvValue.setText(value);
}
@Override
public void onDestroyView() {
super.onDestroyView();
ButterKnife.unbind(this);
}
}
8.PreferenceFragment 实现设置用户习惯操作
> 1.res根目录新建一个xml文件夹和xml文件
> ![这里写图片描述](https://img-blog.csdn.net/20160202141711647)
<?xml version="1.0" encoding="utf-8"?>
<PreferenceCategory
android:title="声音设置">
<CheckBoxPreference
android:key="checkbox_preference"
android:title="是否打开声音"
android:summary="打开声音后可以自动开启音乐" />
</PreferenceCategory>
<PreferenceCategory
android:title="城市">
<EditTextPreference
android:key="edittext_preference"
android:title="昵称"
android:summary="请输入昵称:"
android:dialogTitle="昵称哇:" />
<ListPreference
android:key="list_preference"
android:title="城市名称"
android:summary="请选择城市"
android:entries="@array/city"
android:entryValues="@array/city"
android:dialogTitle="城市名称哇:" />
<PreferenceScreen
android:title="百度"
android:summary="访问">
<intent android:action="android.intent.action.VIEW"
android:data="http://www.android.com" />
</PreferenceScreen>
</PreferenceCategory>
2.String.xml中可能需要使用
<item>北京</item>
<item>上海</item>
<item>关注</item>
<item>杭州</item>
</string-array>
- PrefsFragmentextends PreferenceFragment
package com.recycler.zx.zxrecyclerview.fragments.preference;
import android.os.Bundle;
import android.preference.PreferenceFragment;
import com.recycler.zx.zxrecyclerview.R;
public class PrefsFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Load the preferences from an XML resource
addPreferencesFromResource(R.xml.my_preference);
}
}
9.ActionBar
package com.recycler.zx.zxrecyclerview.ActionBar;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.SearchView;
import android.support.v7.widget.ShareActionProvider;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Toast;
import com.recycler.zx.zxrecyclerview.MenuActivity;
import com.recycler.zx.zxrecyclerview.R;
import com.recycler.zx.zxrecyclerview.TimeActivity;
import com.recycler.zx.zxrecyclerview.fragments.ContentFragment;
import com.recycler.zx.zxrecyclerview.fragments.TitleFragment;
public class MyActionBarActivity extends AppCompatActivity implements ActionBar.TabListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my_action_bar);
ActionBar actionBar = getSupportActionBar();
// actionBar.hide();//隐藏actionbar
actionBar.setHomeButtonEnabled(true);
startActivity(new Intent(this, MenuActivity.class));
//导航条
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
actionBar.setDisplayShowTitleEnabled(false);//标题栏不显示
//添加选项卡
ActionBar.Tab tab = actionBar.newTab()
.setText("美女")
.setTabListener(this);
actionBar.addTab(tab);
tab = actionBar.newTab()
.setText("新闻")
.setTabListener(this);
actionBar.addTab(tab);
TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
telephonyManager.getCallState();
telephonyManager.listen(new PhoneStateListener(),PhoneStateListener.LISTEN_CALL_STATE );
}
@Override
public boolean onCreateOptionsMenu( Menu menu) {
getMenuInflater().inflate(R.menu.menu_context, menu);
//搜索
MenuItem mi = menu.findItem(R.id.yellow);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(mi);
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
Toast.makeText(MyActionBarActivity.this,"---"+query,Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
return false;
}
});
//分享
MenuItem mi2 = menu.findItem(R.id.share);
ShareActionProvider provier = (ShareActionProvider)MenuItemCompat.getActionProvider(mi2);
provier.setShareIntent(getDefaultIntent2());
return true;
}
private Intent getDefaultIntent(){
Intent in = new Intent(Intent.ACTION_SEND);
in.setType("image/*");
return in;
}
private Intent getDefaultIntent2(){
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT,"这是。。");
startActivity(intent);
return intent;
}
//导航条
@Override
public void onTabSelected(ActionBar.Tab tab, FragmentTransaction ft) {
Toast.makeText(this,tab.getText(),Toast.LENGTH_SHORT).show();
}
@Override
public void onTabUnselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabReselected(ActionBar.Tab tab, FragmentTransaction ft) {
}
//电话服务
class PhoneStateListener extends android.telephony.PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
super.onCallStateChanged(state, incomingNumber);
switch (state) {
case TelephonyManager.CALL_STATE_RINGING :
Toast.makeText(MyActionBarActivity.this,"正在响铃",Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_IDLE :
Toast.makeText(MyActionBarActivity.this,"正在响铃",Toast.LENGTH_SHORT).show();
break;
case TelephonyManager.CALL_STATE_OFFHOOK :
Toast.makeText(MyActionBarActivity.this,"正在响铃",Toast.LENGTH_SHORT).show();
break;
}
}
}
}
public class MenuActivity extends AppCompatActivity {
@Bind(R.id.tv_bg)
TextView mTvBg;
@Bind(R.id.tv_popmenu)
TextView mTvPopmenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu);
ButterKnife.bind(this);
ActionBar actionBar = getSupportActionBar();
// actionBar.hide();//隐藏actionbar
actionBar.setDisplayHomeAsUpEnabled(true);//设置当前的activity
10.handler实现原理与机制
![这里写图片描述](https://img-blog.csdn.net/20160202142052746)
> 1.handler发送一个消息(Message)到消息队列(MessageQueue)
> 2.Looper检查消息队列(MessageQueue先进先出)中是否有消息
> 3.如果检测到MessageQueue有消息就发送消息(1.obtainMessage2.msg.obj = “1”3.sendMessage)到HandlerMessage把消息传递回去
>
> Message msg = new Message();
> Message msg = obtainMessage();//使用消息池,消息对象复用,不用每次都new(消息对象池的机制:链表结构)
>
> //handler机制:
> 1.Message 消息对象,内部使用链表数据结构实现一个消息池,用于复用,避免大量创建消息对象,造成内存浪费
> 2.Handler 消息处理者,通过该对象把消息存入消息队列,并通过handlerMessage方法处理消息
> 3.MessageQueue消息队列,用于存储Message对象的数据结构,先进先出
> 4.Looper消息队列的处理者,用于循环检测消息队列(MessageQueue),从消息队列中一个一个的取出消息对象,传入HandlerMessage方法中
11.Handler内存泄露分析
package com.recycler.zx.zxrecyclerview.Handler;
import android.app.Activity;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.recycler.zx.zxrecyclerview.R;
import java.lang.ref.WeakReference;
//Handler的内存泄露问题
//1.定义一个内部类时,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义一个静态(static)内部类(因为静态内部类就相当于一个外部类,不拥有外部类的引用)
//2.引用的强弱:强引用(new 出来的对象,就是强引用,就算内存不足也不会被自动回收,想要回收必须把对象置空或销毁当前对象,回收器才会回收)
// ->软引用(A引用B,当B内存不足的时候,系统就会回收它)
// ->弱引用(引用的对象如果不存在就得不到)
//3.
public class MemoryOverflowActivity extends AppCompatActivity {
private String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_overflow);
//这样写会出现内存泄露
/*1.当Handler作为内部类使用的时候,那么handler持有外部类的引用;
如果外部类退出的时候,handler还在运行的话,外部类(Activity)就退出不了,就算退出了,还还在占用着内存。那么就造成了内存溢出(泄露)
(Handler依赖于外部类)*/
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
}
},60*10*1000);//延迟10分钟执行run方法
Toast.makeText(this,"来过",Toast.LENGTH_SHORT).show();
finish();
}
private MyHandler handler = new MyHandler(this);
//这个是标准的Handler写法,1.static内部类(相当于外部类,不依赖外部类)2.弱引用(防止内存泄露)3.通过mWeakReference.get()返回一个Activity
private static class MyHandler extends Handler{
//软引用Activity
WeakReference<MemoryOverflowActivity> mWeakReference;
public MyHandler(MemoryOverflowActivity activity){
mWeakReference = new WeakReference<MemoryOverflowActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//如果MemoryOverflowActivity被销毁了,那么mWeakReference.get()返回的就是null
//如果返回null你就不能 name 变量(因为name属于MemoryOverflowActivity的变量,MemoryOverflowActivity为null,它的变量自然就不能使用)
//使用弱引用,就可以避免内存泄露(溢出)
MemoryOverflowActivity activity = mWeakReference.get();
if(activity != null) {
}
}
}
}
SplashAcitivity的Style
<activity android:name=“.FirstActivity” android:theme="@android:style/Theme.DeviceDefault.Light.NoA
12.执行耗时操作的第二种方式(AsyncTask),第一种是Thread
package com.recycler.zx.zxrecyclerview.Handler;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.recycler.zx.zxrecyclerview.R;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import butterknife.Bind;
import butterknife.ButterKnife;
//Handler的内存泄露问题
//1.定义一个内部类时,会默认拥有外部类对象的引用,所以建议使用内部类时,最好定义一个静态(static)内部类(因为静态内部类就相当于一个外部类,不拥有外部类的引用)
//2.引用的强弱:强引用(new 出来的对象,就是强引用,就算内存不足也不会被自动回收,想要回收必须把对象置空或销毁当前对象,回收器才会回收)
// ->软引用(A引用B,当B内存不足的时候,系统就会回收它)
// ->弱引用(引用的对象如果不存在就得不到)
//3.
public class MemoryOverflowActivity extends AppCompatActivity {
@Bind(R.id.textView2)
TextView textView2;
@Bind(R.id.progressBar2)
ProgressBar progressBar2;
private String name;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_memory_overflow);
ButterKnife.bind(this);
//这样写会出现内存泄露
/*1.当Handler作为内部类使用的时候,那么handler持有外部类的引用;
如果外部类退出的时候,handler还在运行的话,外部类(Activity)就退出不了,就算退出了,还还在占用着内存。那么就造成了内存溢出(泄露)
(Handler依赖于外部类)*/
/*new Handler().postDelayed(new Runnable() {
@Override
public void run() {
}
}, 60 * 10 * 1000);//延迟10分钟执行run方法
Toast.makeText(this, "来过", Toast.LENGTH_SHORT).show();
finish();*/
}
private MyHandler handler = new MyHandler(this);
//这个是标准的Handler写法,1.static内部类(相当于外部类,不依赖外部类)2.软引用(防止内存泄露)3.通过mWeakReference.get()返回一个Activity
private static class MyHandler extends Handler {
//软引用Activity
WeakReference<MemoryOverflowActivity> mWeakReference;
public MyHandler(MemoryOverflowActivity activity) {
mWeakReference = new WeakReference<MemoryOverflowActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//如果MemoryOverflowActivity被销毁了,那么mWeakReference.get()返回的就是null
//如果返回null你就不能 name 变量(因为name属于MemoryOverflowActivity的变量,MemoryOverflowActivity为null,它的变量自然就不能使用)
//使用软引用,就可以避免内存泄露(溢出)
MemoryOverflowActivity activity = mWeakReference.get();
if (activity != null) {
}
}
}
//通过AsyncTask实现一个异步任务
private static class DownLoadAsynTask extends AsyncTask<String, Integer, String> {
private MemoryOverflowActivity mActivity;//这样写是有问题的,你既然使用了弱引用,就不能申明成员变量
在下面的每个方法中,只要你用到了你就必须通过mWeakReference.get();方法获取,不能直接申明一个成员变量接收
public DownLoadAsynTask(MemoryOverflowActivity activity) {
WeakReference<MemoryOverflowActivity> mWeakReference = new WeakReference<MemoryOverflowActivity>(activity);
mActivity = mWeakReference.get();
}
//执行任务之前触发,可以做一些初始化工作,主线程调用的
@Override
protected void onPreExecute() {
super.onPreExecute();
mActivity.textView2.setText("开始执行下载任务");
mActivity.progressBar2.setProgress(0);
}
//执行后台任务的方法,类似于线程,所以不能在该方法中访问Ui组件
@Override
protected String doInBackground(String... params) {
String imgurl = params[0];
try {
URL url = new URL(imgurl);
最后
在此为大家准备了四节优质的Android高级进阶视频:
架构师项目实战——全球首批Android开发者对Android架构的见解
附相关架构及资料
往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
}
}
}
//通过AsyncTask实现一个异步任务
private static class DownLoadAsynTask extends AsyncTask<String, Integer, String> {
private MemoryOverflowActivity mActivity;//这样写是有问题的,你既然使用了弱引用,就不能申明成员变量
在下面的每个方法中,只要你用到了你就必须通过mWeakReference.get();方法获取,不能直接申明一个成员变量接收
public DownLoadAsynTask(MemoryOverflowActivity activity) {
WeakReference<MemoryOverflowActivity> mWeakReference = new WeakReference<MemoryOverflowActivity>(activity);
mActivity = mWeakReference.get();
}
//执行任务之前触发,可以做一些初始化工作,主线程调用的
@Override
protected void onPreExecute() {
super.onPreExecute();
mActivity.textView2.setText("开始执行下载任务");
mActivity.progressBar2.setProgress(0);
}
//执行后台任务的方法,类似于线程,所以不能在该方法中访问Ui组件
@Override
protected String doInBackground(String... params) {
String imgurl = params[0];
try {
URL url = new URL(imgurl);
最后
在此为大家准备了四节优质的Android高级进阶视频:
架构师项目实战——全球首批Android开发者对Android架构的见解
附相关架构及资料
[外链图片转存中…(img-yVKXFsNN-1713445554933)]
往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-dq0pmZ9J-1713445554933)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!