java - 如何在 AsyncTask 中调用片段?
问题描述
我有办法每 15 秒测试一次 Internet 连接。如果设备有互联网连接,则不需要任何东西,但如果您没有互联网连接,我想调用 Fragment。崩溃。如果我不能从 AsyncTask 中调用片段,我可以从 MainActivity 中调用它。我不知道怎么做。
CheckInternetAsyncTask.class
public class CheckInternetAsyncTask extends AsyncTask<Void, Integer, Boolean> {
private MainActivity activity;
private Context context;
public CheckInternetAsyncTask(Context context) {
this.context = context;
}
@Override
protected Boolean doInBackground(Void... params) {
ConnectivityManager cm =
(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
assert cm != null;
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean isConnected = activeNetwork != null &&
activeNetwork.isConnected();
if (isConnected) {
try {
InetAddress ipAddr = InetAddress.getByName("google.com");
//You can replace it with your name
return !ipAddr.equals("");
} catch (Exception e) {
Log.e("TAG", "Error checking internet connection"+ e.getMessage());
return false;
}
} else {
//Log.d("TAG", "No network available!");
return false;
}
}
@Override
protected void onPostExecute(Boolean result) {
super.onPostExecute(result);
//Log.d("TAG", "result" + result);
if(result){
// do ur code
Toast.makeText(context,"Device is connected to internet.", Toast.LENGTH_LONG).show();
}
else {
Toast.makeText(context,"Device is not connected to internet!",Toast.LENGTH_LONG).show();
EthernetControlFragment ethernetControlFragment = EthernetControlFragment.newInstance();
ethernetControlFragment.show(activity.getSupportFragmentManager(), "ethernet");
ethernetControlFragment.setCancelable(false);
}
}
}
主要活动
Handler handler = new Handler();
Runnable runnable;
int delay = 15*1000;
@Override
protected void onResume() {
handler.postDelayed( runnable = new Runnable() {
public void run() {
//do something
new CheckInternetAsyncTask(getApplicationContext()).execute();
handler.postDelayed(runnable, delay);
}
}, delay);
super.onResume();
}
@Override
protected void onPause() {
handler.removeCallbacks(runnable);
super.onPause();
}
LOGCAT
java.lang.NullPointerException: Attempt to invoke virtual method 'androidx.fragment.app.FragmentManager com.maksu.falamania.MainActivity.getSupportFragmentManager()' on a null object reference
at com.maksu.falamania.CheckInternetAsyncTask.onPostExecute(CheckInternetAsyncTask.java:63)
at com.maksu.falamania.CheckInternetAsyncTask.onPostExecute(CheckInternetAsyncTask.java:14)
at android.os.AsyncTask.finish(AsyncTask.java:632)
at android.os.AsyncTask.access$600(AsyncTask.java:177)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5832)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
解决方案
您永远不会为异步任务设置属性activity
。
你 AsyncTask 的构造函数应该是:
public CheckInternetAsyncTask(Activity activity) {
this.context = activity.getApplicationContext();
this.activity = activity;
}
并将您的任务称为:
new CheckInternetAsyncTask(MainActivity.this).execute();
推荐阅读
- regex - 替换管道字符“|”之间的字符串 和“_”使用 sed
- javascript - Firebase Google 登录卡在 /__/auth/handler 路由上
- azure - QnAMaker 日志的洞察查询中的元数据
- sql - 值在逗号分隔的字符串中的查询条件
- python - Tensorflow Keras 方法 get_weights 和 set_weights 有对应的 PyTorch 吗?
- r - 具有 na.action=na.fail 的 lm 模型中的错误,这是 MuMIn 疏浚功能所必需的
- flutter - 具有相同名称的颤振合并数组
- git - 我的 GitHub 不允许我推送,而是要求我提供登录凭据并使其无效,即使我的密码正确也是如此
- r - ggradar 变量的长名称 - 更改标签
- tensorflow - 多个签名中的 TFLite 输入/输出量化