2016-04-14 16 views
0

を引き起こすIは活性がロードされる非同期Okhttpコール、((getActiveRequestsとしてonStartメソッドから呼び出される))を実行するAndroidの活性を有します。アンドロイドのsetTextクラッシュ

public class MainActivity extends AppCompatActivity implements View.OnClickListener { 

Button btLogout; 
UserLocalStore userLocalStore; 
String username; 
String userEmail; 
String recentAppName; 
String recentRequestTime; 
String isExpired; 
TelephonyManager telephonyManager; 
OkHttpClient client; 
TextView tvRecentAppName, tvRecentRequestTime, tvIsExpired; 


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

    userLocalStore = new UserLocalStore(this); 
    telephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); 

    TextView tvUserName = (TextView) findViewById(R.id.userName); 
    TextView tvUserEmail = (TextView) findViewById(R.id.userEmail); 

    tvRecentAppName = (TextView) findViewById(R.id.recentAppName); 
    tvRecentRequestTime = (TextView) findViewById(R.id.recentRequestTime); 
    tvIsExpired = (TextView) findViewById(R.id.isExpired); 

    client = new OkHttpClient(); 
    username = userLocalStore.getLoggedInUser().name; 
    userEmail = userLocalStore.getLoggedInUser().email; 

    tvUserEmail.setText(userEmail); 
    tvUserName.setText(username); 

    btLogout = (Button) findViewById(R.id.btLogout); 
    btLogout.setOnClickListener(this); 
} 

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

    if(authenticateUser() == true){ 
     getActiveRequests(); 
    }else{ 
     startActivity(new Intent(this, LoginActivity.class)); 
    } 
} 

私は何をしたいのアップデートでは、HTTP呼び出しがSetTextの方法を用いて作製された後UIです。 GetActiveRequests()メソッドで実装された私の呼び出しです。

client.newCall(request) 
      .enqueue(new Callback() { 

       @Override 
       public void onFailure(Call call, IOException e) { 
        String hello = "failed call"; 
       } 

       @Override 
       public void onResponse(Call call, Response response) throws IOException { 
        final String responseData = response.body().string(); 

        if (responseData != null) { 
         Gson gson = new Gson(); 
         JsonElement element = gson.fromJson(responseData, JsonElement.class); 
         JsonObject jsonObject = element.getAsJsonObject(); 
         final AccessRequest request = gson.fromJson(jsonObject, AccessRequest.class); 

         recentAppName = request.AppName.toString(); 
         recentRequestTime = request.RequestTime.toString(); 
         if (request.IsExpired) 
          isExpired = "Has Expired"; 
         else isExpired = "Active"; 

         tvRecentAppName.setText(recentAppName); 
         tvRecentRequestTime.setText(recentRequestTime); 
         tvIsExpired.setText(isExpired); 
        } 
       } 
      }); 

私が午前問題は、デバッガは、コードのSetText行に達したとき、アプリがクラッシュする原因と密接していることです。私はこれをどのように解決できるかについては迷っていますが、Okhttp AsyncコールではUIを更新できないものがあると想定しています.setTextメソッドはonCreate()で正常に動作しています。

+0

結果がnullで、ビューにNULL値を設定できない可能性があります。 – Eenvincible

+0

ここにあるJake Whartonsの回答を参照してください。http://stackoverflow.com/questions/24246783/okhttp-response-callbacks-on-the-メインスレッド –

+0

私の[回答](http://stackoverflow.com/questions/36629346/android-settext-in-okhttp-async-callback-causing-crash/36629456#36629456)を確認し、UIスレッドのビューを更新しようとします。 。 –

答えて

1

ビューの更新はUIスレッドでのみ実行でき、OkHttpのonResponseはバックグラウンドスレッドで実行されるためです。あなたがonFailure上の任意のビューを更新している場合も同様

@Override 
public void onResponse(Call call, Response response) throws IOException { 
    final String responseData = response.body().string(); 

    if (responseData != null) { 
     Gson gson = new Gson(); 
     JsonElement element = gson.fromJson(responseData, JsonElement.class); 
     JsonObject jsonObject = element.getAsJsonObject(); 
     final AccessRequest request = gson.fromJson(jsonObject, AccessRequest.class); 

     recentAppName = request.AppName.toString(); 
     recentRequestTime = request.RequestTime.toString(); 
     if (request.IsExpired) 
      isExpired = "Has Expired"; 
     else isExpired = "Active"; 

     MainActivity.this.runOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       //Handle UI here       
       tvRecentAppName.setText(recentAppName); 
       tvRecentRequestTime.setText(recentRequestTime); 
       tvIsExpired.setText(isExpired);     
      } 
     }); 
    } 
} 

、UIスレッド上で、それを実行します。このようなメインスレッド上でそれを実行してみてください。

+0

よ、これは私のために働いています:) – jjharrison

+0

@jjharrison、素晴らしい! –

関連する問題