Android学习笔记-Android初级 (一)(1),2024年最新android组件化面试题

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

}

}

//代码添加

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>
  1. 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架构的见解

附相关架构及资料

image.png

往期Android高级架构资料、源码、笔记、视频。高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter全方面的Android进阶实践技术,群内还有技术大牛一起讨论交流解决问题。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 8
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值