2017-01-26 5 views
0

私が続ける前に、アンドロイドで開発時間が10時間未満であると言いたいので、あなたの答えに優しくしてください。アクティビティ - BackgroundTaskランタイムを実行中

私は、バックグラウンドタスクからタブアクティビティに値を戻そうとしたときに突っ込んだと思っていました。答えがインターフェイス/リスナーにあることを示すかなりの数のスレッドを読んで、私はそれを正しく実行したと思っています(下記)、そしてそれはランタイムを投げます。

私はあなたが

タブの活動

public class Tab1Activity extends Activity implements ValueListener 
    { 

     String task,username,password; 

     @Override 
     public void onValueComputed(String computedValue) 
     { 
      //do something... 
     } 

@Override 
protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.tab1); 

      BackgroundTask backgroundTaskLogin = new BackgroundTask(Tab1Activity.this);  
      backgroundTaskLogin.execute(task,username,password); 
     } 
} 

に従うことができますので、これはタスク

public class BackgroundTask extends AsyncTask<String,Void,String> 
{ 
     Context context; 




     BackgroundTask(Context ctx) 
     { 
      this.context = ctx; 
     } 

     @Override 
     protected String doInBackground(String... params) 
     { 
      // do stuff 
      return datastuff  
     } 

///////////////////////////////// 

@Override 
     protected void onPreExecute() 
     { 
      super.onPreExecute(); 


     } 
/////////////////////////////////////// 


     @Override 
     protected void onProgressUpdate(Void... values) 
     { 
      super.onProgressUpdate(values); 
     } 


////////////////////////////// 


     ValueListener listener; 

     public void MyAsyncTask (ValueListener valueListener) 
     { 
      this.listener = valueListener; 
     } 

     @Override 
     protected void onPostExecute(String result) 
     { 


      listener.onValueComputed(result); 

// The value gets here OK - but when adding the above listener it throws a runtime 

      System.out.println("kkkkkkkkkkkkkkkkkk"+result); 

     } 

これはインタフェース

でバックグラウンドでのコードにコメントを追加しようとします
public interface ValueListener 
{ 
     public void onValueComputed(String computedValue); 

} 

これは私が試してみて、リスナーを追加するまで

01-26 17:26:20.935: E/AndroidRuntime(869): FATAL EXCEPTION: main 
01-26 17:26:20.935: E/AndroidRuntime(869): Process: com.example.tabdemo, PID: 869 
01-26 17:26:20.935: E/AndroidRuntime(869): java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.tabdemo.ValueListener.onValueComputed(java.lang.String)' on a null object reference 
01-26 17:26:20.935: E/AndroidRuntime(869): at com.example.tabdemo.BackgroundTask.onPostExecute(BackgroundTask.java:223) 
01-26 17:26:20.935: E/AndroidRuntime(869): at com.example.tabdemo.BackgroundTask.onPostExecute(BackgroundTask.java:1) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.AsyncTask.finish(AsyncTask.java:651) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.AsyncTask.access$500(AsyncTask.java:180) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.Handler.dispatchMessage(Handler.java:102) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.os.Looper.loop(Looper.java:158) 
01-26 17:26:20.935: E/AndroidRuntime(869): at android.app.ActivityThread.main(ActivityThread.java:7224) 
01-26 17:26:20.935: E/AndroidRuntime(869): at java.lang.reflect.Method.invoke(Native Method) 
01-26 17:26:20.935: E/AndroidRuntime(869): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
01-26 17:26:20.935: E/AndroidRuntime(869): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

すべてが、大丈夫です、それはあなたがそう、それはNPE上を引き起こしているリスナーを定義していないどのような問題が

+0

移動 'BackgroundTaskのbackgroundTaskLogin =新しいBackgroundTaskの(Tab1Activity.this)。メソッドの内部にあるbackgroundTaskLogin.execute(タスク、ユーザー名、パスワード);あなたの 'context'はライフサイクルを開始するまで最初に起動するとヌルです – codeMagic

+0

待ち、' MyAsyncTask() 'はどこで呼び出されますか? – codeMagic

+0

バックグラウンドタスクはメソッド内にありました.. –

答えて

0

ValueListenerオブジェクトを初期化していません。私はあなたがコンストラクタのロジックを混乱させたと思う。これはあなたのコンストラクタです:

BackgroundTask(Context ctx) { 
    this.context = ctx; 
} 

あなたはコンストラクタとして混乱することができるが、それはない別の方法があります。あなたがMyAsyncTask(ValueListener valueListener)と呼ばれることはありませんので、

public void MyAsyncTask (ValueListener valueListener) { 
      this.listener = valueListener; 
     } 

は今、あなたのlistenerオブジェクト参照がnullであり、したがってjava.lang.NullPointerException

これは、あなたが何をすべきかです:

public class BackgroundTask extends AsyncTask<String,Void,String> 
{   
    private ValueListener listener; 

    BackgroundTask(ValueListener listener) 
    { 
     this.listener= listener; 
    } 
} 
0
@Override 
     protected void onPostExecute(String result) 
     { 


      listener.onValueComputed(result); 

// The value gets here OK - but when adding the above listener it throws a runtime 

      System.out.println("kkkkkkkkkkkkkkkkkk"+result); 

     } 

で明らかであるエラーです

listener.onValueComputed(result); 
関連する問題