设备连接到互联网时启动AsyncTask

时间:2014-05-23 16:00:34

标签: java android broadcastreceiver

我知道有很多关于这个问题的问题 - 而且我已经阅读了所有问题 - 但我真正的问题在于背景概念。我试图做的是用广播接收器嗅探连接变化,如果设备连接互联网,启动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并完成活动。

2 个答案:

答案 0 :(得分:0)

您正在将null传递给AsyncTask构造函数,然后传递给ProgressDialog构造函数; activity只能是null

无论如何,通常情况下,传递Activity引用不是一个好主意,因为你无法真正控制Activity的生命。

这是一个非常棒的post,它解释了Context的不同类型。

答案 1 :(得分:0)

您无法仅通过“活动”从BroadcastReceiver创建对话框。您应该从BroadcastReceiver启动一个Activity,并从那里显示该对话框。如果您只想显示对话框而不是空白屏幕,请不要使用setContentView

看看这个答案:http://www.stackoverflow.com/a/8766864/1199931