我知道有很多关于这个问题的问题 - 而且我已经阅读了所有问题 - 但我真正的问题在于背景概念。我试图做的是用广播接收器嗅探连接变化,如果设备连接互联网,启动AsyncTask。根据日志,我可以看到"检测到连接并且任务正在启动"当我关闭互联网连接时它记录并且它不会抛出异常并且工作正常。但是当我打开互联网时,我可以再次看到日志并立即收到错误。每次我最终都遇到了这个java空指针异常问题。
NetworkChangeReceiver.java
package com.example.bitirmeson;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
System.out.println("Broadcast has received.");
ConnectivityManager cm = ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnectedOrConnecting()&& cm.getActiveNetworkInfo().isAvailable()&& cm.getActiveNetworkInfo().isConnected())
{
System.out.println("Connection detected and task is starting.");
FtpAsync task1 = new FtpAsync(null);
task1.execute();
}
}
}
FtpAsync.java
package com.example.bitirmeson;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import org.apache.commons.io.IOUtils;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPCmd;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
public class FtpAsync extends AsyncTask <Void, Void, String>{
private ProgressDialog mDialog;
private Activity activity;
public FtpAsync(Activity activity) {
this.activity = activity;
this.mDialog = new ProgressDialog(activity);
}
@Override
protected void onPreExecute() {
super.onPreExecute();
mDialog.setMessage("Veriler alınıyor, lütfen bekleyiniz.");
mDialog.show();
mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mDialog.setCancelable(true);
}
@Override
protected String doInBackground(Void... params) {
// TODO Auto-generated method stub
String theString = "";
FTPClient ftpClient = new FTPClient();
try {
ftpClient.connect("f11-preview.125mb.com", 21);
System.out.println(ftpClient.getReplyString());
ftpClient.enterLocalPassiveMode();
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.USER, "1678578");
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.PASS, "ertan1991");
System.out.println(ftpClient.getReplyString());
ftpClient.sendCommand(FTPCmd.CWD, "/CodeJava");
System.out.println(ftpClient.getReplyString());
System.out.println(ftpClient.getReplyString());
InputStream is= (ftpClient.retrieveFileStream("deneme1.txt"));
System.out.println("Input Stream has opened.");
StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, "UTF-8");
theString = writer.toString();
System.out.println(theString);
}
catch (IOException ex) {
System.err.println(ex);
}
return theString;
}
protected void onPostExecute(String deger) {
// TODO: check this.exception
// TODO: do something with the feed
//super.onPostExecute(deger);
if (this.mDialog.isShowing()) {
this.mDialog.dismiss();
}
IkinciEkran.text1.setText(deger);
}
}
我的LogCat文件:
05-23 19:05:36.585: I/System.out(20836): Broadcast has received.
05-23 19:05:36.585: I/System.out(20836): Connection is detected and task is starting.
05-23 19:05:36.585: D/AndroidRuntime(20836): Shutting down VM
05-23 19:05:36.585: W/dalvikvm(20836): threadid=1: thread exiting with uncaught exception (group=0x40faf2a0)
05-23 19:05:36.595: E/AndroidRuntime(20836): FATAL EXCEPTION: main
05-23 19:05:36.595: E/AndroidRuntime(20836): java.lang.RuntimeException: Unable to start receiver com.example.bitirmeson.NetworkChangeReceiver: java.lang.NullPointerException
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2269)
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.app.ActivityThread.access$1600(ActivityThread.java:134)
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1294)
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.os.Handler.dispatchMessage(Handler.java:99)
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.os.Looper.loop(Looper.java:137)
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.app.ActivityThread.main(ActivityThread.java:4867)
05-23 19:05:36.595: E/AndroidRuntime(20836): at java.lang.reflect.Method.invokeNative(Native Method)
05-23 19:05:36.595: E/AndroidRuntime(20836): at java.lang.reflect.Method.invoke(Method.java:511)
05-23 19:05:36.595: E/AndroidRuntime(20836): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1007)
05-23 19:05:36.595: E/AndroidRuntime(20836): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:774)
05-23 19:05:36.595: E/AndroidRuntime(20836): at dalvik.system.NativeStart.main(Native Method)
05-23 19:05:36.595: E/AndroidRuntime(20836): Caused by: java.lang.NullPointerException
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.app.AlertDialog.resolveDialogTheme(AlertDialog.java:142)
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.app.AlertDialog.<init>(AlertDialog.java:98)
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.app.ProgressDialog.<init>(ProgressDialog.java:77)
05-23 19:05:36.595: E/AndroidRuntime(20836): at com.example.bitirmeson.FtpAsync.<init>(FtpAsync.java:22)
05-23 19:05:36.595: E/AndroidRuntime(20836): at com.example.bitirmeson.NetworkChangeReceiver.onReceive(NetworkChangeReceiver.java:21)
05-23 19:05:36.595: E/AndroidRuntime(20836): at android.app.ActivityThread.handleReceiver(ActivityThread.java:2262)
解决方案
首先,我从NetworkChangeReceiver类开始新的空白活动,然后从那里开始AsyncTask并完成活动。
答案 0 :(得分:0)
您正在将null
传递给AsyncTask
构造函数,然后传递给ProgressDialog
构造函数; activity
只能是null
。
无论如何,通常情况下,传递Activity
引用不是一个好主意,因为你无法真正控制Activity
的生命。
这是一个非常棒的post,它解释了Context
的不同类型。
答案 1 :(得分:0)
您无法仅通过“活动”从BroadcastReceiver创建对话框。您应该从BroadcastReceiver启动一个Activity,并从那里显示该对话框。如果您只想显示对话框而不是空白屏幕,请不要使用setContentView
。