0

我有一個活動類FileDownloader與AsyncTask子類FileDownloaderAsync。 要更新我的MainActivity-ProgressDialog,我想發送一個updateProgress-function,這是由onProgressUpdate -Event調用的意圖。Android:來自Async的意圖調用拋出空指針異常

但我每次都得到java.lang.NullPointerException if Intent in = new Intent(this,ActMain.class);調用

這裏是我的代碼片段:

public class FileDownloader extends Activity { 

... 

public void updateProgress(int progressVal) { 
    Bundle bdl = new Bundle(); 
    bdl.putInt("DownloadProgress", progressVal); 
    Intent in = new Intent(this, ActMain.class); 
    in.putExtras(bdl); 
    startActivity(in); 
} 

    class FileDownloaderAsync extends AsyncTask<String, String, String> { 

     ... 

     protected void onProgressUpdate(String... progress){ 
     Log.d("ANDRO_ASYNC", progress[0]);   
     updateProgress(Integer.parseInt(progress[0])); 
     } 

    } 
} 

而且這裏也是logcat的產出:

`02-16 10:29:52.255: W/dalvikvm(540): threadid=1: thread exiting with uncaught exception (group=0x409961f8)  
02-16 10:29:52.265: E/AndroidRuntime(540): FATAL EXCEPTION: main 
02-16 10:29:52.265: E/AndroidRuntime(540): java.lang.NullPointerException 
02-16 10:29:52.265: E/AndroidRuntime(540): at android.content.ContextWrapper.getPackageName(ContextWrapper.java:127) 
02-16 10:29:52.265: E/AndroidRuntime(540): at android.content.ComponentName.<init>(ComponentName.java:75) 
02-16 10:29:52.265: E/AndroidRuntime(540): at android.content.Intent.<init>(Intent.java:3004) 
02-16 10:29:52.265: E/AndroidRuntime(540): at de.tachoron.lwplayer.FileDownloader.updateProgress(FileDownloader.java:40) 
02-16 10:29:52.265: E/AndroidRuntime(540): at de.tachoron.lwplayer.FileDownloader$FileDownloaderAsync.onProgressUpdate(FileDownloader.java:94) 
02-16 10:29:52.265: E/AndroidRuntime(540): at de.tachoron.lwplayer.FileDownloader$FileDownloaderAsync.onProgressUpdate(FileDownloader.java:1) 
02-16 10:29:52.265: E/AndroidRuntime(540): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:618) 
02-16 10:29:52.265: E/AndroidRuntime(540): at android.os.Handler.dispatchMessage(Handler.java:99) 
02-16 10:29:52.265: E/AndroidRuntime(540): at android.os.Looper.loop(Looper.java:137) 
02-16 10:29:52.265: E/AndroidRuntime(540): at android.app.ActivityThread.main(ActivityThread.java:4340) 
02-16 10:29:52.265: E/AndroidRuntime(540): at java.lang.reflect.Method.invokeNative(Native Method) 
02-16 10:29:52.265: E/AndroidRuntime(540): at java.lang.reflect.Method.invoke(Method.java:511) 
02-16 10:29:52.265: E/AndroidRuntime(540): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
02-16 10:29:52.265: E/AndroidRuntime(540): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
02-16 10:29:52.265: E/AndroidRuntime(540): at dalvik.system.NativeStart.main(Native Method)´ 
+0

你把一個意圖在FileDownloader Activity裏面來啓動Activity FileDownloader?爲什麼? – donfuxx

+0

對不起,你是對的。我嘗試了一些參數,然後複製了錯誤的剪輯。但是錯誤也出現在固定的代碼片段中。 – CodeTorero

+0

發佈顯示在您的LogCat上的錯誤信息,NullPointerException將在ActMain.class內部引發 – Jorgesys

回答

0

這是一種錯誤的做法來更新mainactivity進度。起初,我將解釋爲什麼你得到空指針,然後我會告訴你我在我的項目中實現的方式。

空指針問題:

updateProgressonProgressUpdate多次調用。現在,當第一次progressUpdated時,第一次調用updateProgressonProgressUpdate。這意味着startActivity(in);正在執行updateProgressActMain啓動。所以,此時您的FileDownloader活動處於pause狀態。因此,當下次進度更新時,您的updateProgress再次從onProgressUpdate調用,並且updateProgress嘗試使用FileDownloader's context嘗試啓動ActMain活動。但你的FileDownloader處於暫停狀態,這就是爲什麼你得到nullPointer異常。

更新mainActivity進度的一種方式:

它是使用BroadCast最佳途徑。別擔心,這並不複雜。做我剛纔所示的波紋管:

在你的FileDownloader類添加這些代碼來通知MainActivity關於進度變化。當下載開始時,開始您的MainActivity

public static final String ACTION_DOWNLOAD_ON_GOING = "downloading"; 
public static final String PROGRESS = "progress"; 
public static final String ACTION_DOWNLOADMANEGAR = "signeture_of_downloadmanegar"; 
public static final String ACTION_HINT = "hint"; 

@Override 
protected void onProgressUpdate(Integer... values) {     
    super.onProgressUpdate(values);    
    // Broadcast the download progress to MainActivity 
    broadCast(ACTION_DOWNLOAD_ON_GOING, values[0]); 
} 

private void broadCast(String hint, int proggress){ 
    Intent i = new Intent(); 
    i.setAction(ACTION_DOWNLOADMANEGAR); 
    i.putExtra(ACTION_HINT, hint); 
    i.putExtra(PROGRESS, proggress); 
    sendBroadcast(i); 
} 

這部分代碼將像FM廣播電臺一樣廣播進程(int)。所有你需要做的就是,就像我們的無線電收到廣播電臺的傳輸一樣,趕上另一個班級的進度。接收請執行:

1。在您的MainActivity創建一個內部類:

class MyBroadcastReceiver extends BroadcastReceiver{ 

    @Override 
    public void onReceive(final Context context, Intent intent) { 
     String action = intent.getAction(); 
     //Log.e("Receiver", "Broadcast received: " + action); 
     if (action.equals(FileDownloader.ACTION_DOWNLOADMANEGAR)) { 
      String hint = intent.getStringExtra(FileDownloader.ACTION_HINT); 
      if (hint.equals(FileDownloader.ACTION_DOWNLOAD_ON_GOING)) { 
       //update your progrerssBar 
       progressBar.setProgress(intent.getIntExtra(FileDownloader.PROGRESS, 0)); 
       // Log.e("Receiver", "progress: " + intent.getIntExtra(FileDownloader.PROGRESS, 0)); 
      } 
     } 
    }  
} 

以下步驟:

private BroadcastReceiver myReceiver = new MyBroadcastReceiver(); 
private boolean isRegistered = false; 

@override 
onPause(){ 
    supre.onPause(); 
    if(isRegistered){ 
     try { 
      // use only one between the two options bellow 
      // if u r using activity 
      unregisterReceiver(myReceiver); 
      // if u r using Fragment 
      getActivity().unregisterReceiver(myReceiver); 
     } catch (Exception e) {} 
    } 
} 

-------------------------------------------------------- 
@Override 
public void onResume() { 
    super.onResume(); 
    if(!isRegistered){   
     IntentFilter filter = new IntentFilter(); 
     filter.addAction(FileDownloader.ACTION_DOWNLOADMANEGAR); 
     // use only one between the two options bellow 
     // if u r using activity 
     registerReceiver(myReceiver, filter); 
     // if u r using Fragment 
     getActivity().registerReceiver(myReceiver, filter); 
     isRegistered = true; 
    } 
} 

這個過程意味着,如果u nevigate到MainActiviy並在下載的進展,然後在進度條MainActivity將更新每個thime下載進度更改在您的FileDownloader

讓我知道你是否得到任何問題來實現上述過程。

+1

感謝您的詳細解答!你不僅在我目前的問題上幫助了我 - 你也給了我一個新的理解。謝謝你的時間花花公子! :) – CodeTorero