2016-10-30 4 views
-2

基本的には、AsyncTaskを使用してprogressBarを表示し、progress10の後にMainActivityにあるメソッドを実行する必要があります。 progressBar10/10の場合、次のエラーが発生するとクラッシュします。onPostExecuteはインテントを開けません

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

MapProgressTask

@Override 
protected void onPostExecute(String result) { 
    textView.setText(result); 
    button.setEnabled(true); 
    progressDialog.hide(); 
    MainActivity mainActivity = new MainActivity(); 
    mainActivity.getGooglePlace(); 
} 

MainActivity

protected void getGooglePlace() 
    { 
     PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); 
     Intent intent; 
     try { 
      intent = builder.build(MainActivity.this); 
      startActivityForResult(intent, place_picker_request); 
     } catch (GooglePlayServicesRepairableException e) { 
      e.printStackTrace(); 
     } catch (GooglePlayServicesNotAvailableException e) { 
      e.printStackTrace(); 
     } 
    } 

あなたはprogressBarがいっぱいになったとき、私はその方法を実行することができますどのように私にしてください教えてください。ありがとう!あなたのonPostExecuteイベントで

+1

MainActivity mainActivity = new MainActivity();?あなたは何をしようとしているのですか? – Vardan95

+1

あなたのアクティビティをインスタンス化して、このアクティビティ内のメソッドを実行しようとしないでください。そのメソッドをパブリックの分離クラス内に作成します。 – Opiatefuchs

+0

**決して**あなた自身のアクティビティのインスタンスを作成しないでください。したがって、まず、次の行を削除してください: 'MainActivity mainActivity = new MainActivity(); mainActivity.getGooglePlace(); '次に、この他のアクティビティを開始するためのより良い計画を決定する(例えば、 'Context'をパラメータとする' static'メソッド)。 'AsyncTask'が動作している間(例えば、ユーザが画面を回転させる)、設定変更の可能性を考慮に入れてください。 – CommonsWare

答えて

2

、あなたは非活動クラスから活動を開始しているとき、活動を開始する前にフラグを追加する必要があります:私の視点で

protected void getGooglePlace() 
{ 
    PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); 
    Intent intent; 
    try { 
     intent = builder.build(MainActivity.this); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //Needed when starting an activity from a non-activity class 
     startActivityForResult(intent, place_picker_request); 
    } catch (GooglePlayServicesRepairableException e) { 
     e.printStackTrace(); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     e.printStackTrace(); 
    } 
} 
+0

この場合、 'FLAG_ACTIVITY_NEW_TASK'は必要ないと思います。これは、あなたのコメントが示すように、アクティビティが非アクティビティの「コンテキスト」によって開始されているときに必要とされ、これが当てはまるという証拠はありません。 – CommonsWare

0

、必要はありませんあなたの活動をインスタンス化する。それは悪い決断だからです。非同期タスクをネストされたクラスとしてアクティビティに配置し、getGooglePlace()メソッドを呼び出すこともできますが、これも悪い考えです。私は次のアプローチを提案します。

public class MyTask extends AsyncTask<Void, Void, Void> { 
    private WeekReference<MyListener> mListener; 

    public MyTask(MyListener listener) { 
     mListener= new WeakReference<MyListener>(listener); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     MyListener activity = mListener.get(); 
     if (activity != null) { 
     // do your stuff with activity here 
     } 
    } 
    } 
関連する問題