Webサービスからのデータがない状態でトーストを表示すると、Androidのアプリがクラッシュします

キラー

すべて。ウェブサービスhttp://api.openweathermap.org/data/2.5/weather?q=CityNameからのデータを表示しているダミーアプリケーションを使用しています。すべて正常に機能していますが、直面している問題は、表示するときに発生することです。サーバーからのデータがない場合、またはデバイスでインターネットが利用できない場合にトーストすると、エミュレーターの表示中にアプリがクラッシュします。

"Unfortunately wheather app stopped working "

この問題は、デバイスにインターネットがない場合にのみ発生します。インターネットを切断したときに問題が発生する行は次のようになります。

Toast.makeText(getApplicationContext(),  "Not able to connect", Toast.LENGTH_LONG).show();

この行にコメントすると、アプリは正常に動作します。このファイルのすべてのコードは次のようになります。

package com.mubu.wheathertoday.wheathertoday;

import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import org.json.JSONObject;
import org.w3c.dom.Text;


public class MainActivity extends ActionBarActivity {
    EditText etCity;
    Button btnShow;
    ProgressDialog pbar;
    String JsonString;
    TextView tvr;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

         etCity=(EditText)findViewById(R.id.etCity);
        btnShow=(Button)findViewById(R.id.btnShow);


        btnShow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                AsyncGetData gd=new AsyncGetData();
                gd.execute();
            }

        });

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


    private  class AsyncGetData extends AsyncTask<Void,Void,Void>{


        @Override
        protected Void doInBackground(Void... params) {
  try {
      ServiceHandler sh = new ServiceHandler();
      String url="http://api.openweathermap.org/data/2.5/weather?q="+etCity.getText().toString().trim();
    JsonString = sh.makeServiceCall(url, ServiceHandler.POST);
      if (JsonString != null) {
         Intent i=new Intent(getApplicationContext(),WheatherActivity.class);
          try{
          i.putExtra("jsn",JsonString);
         i.putExtra("city",etCity.getText().toString());
           startActivity(i);
          }catch (Exception e){


      }
      }
      else
      {
    try{

       Toast.makeText(getApplicationContext(),  "Not able to connect", Toast.LENGTH_LONG).show();


 // if I disconnect Internet this line gets executed and my app crashes
            }catch (Exception e){


}
      }

      }
  catch (Exception e){etCity.setText(e.getMessage());}
            return null;

        }

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

              pbar=new ProgressDialog(MainActivity.this);
            pbar.setMessage("Please wait...");
            pbar.setCancelable(false);
            pbar.show();
        }

        @Override
        protected void onPostExecute(Void s) {
            super.onPostExecute(s);
           if(pbar.isShowing() )
                pbar.dismiss();


        }

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

}
ディエゴフレニッシュ

問題は、からユーザーインターフェイスを更新しようとしていることですdoInBackgrounddoInBackgroundメインではなく、バックグラウンドスレッド(UIスレッドとも呼ばれます)で実行されます。

AsyncTaskのドキュメント(私の強調)で読むことができるように

onPreExecute()は、タスクが実行される前にUIスレッド呼び出されます。このステップは通常、タスクをセットアップするために使用されます。たとえば、ユーザーインターフェイスに進行状況バーを表示します。

doInBackground(Params ...)、onPreExecute()の実行が終了した直後にバックグラウンドスレッド呼び出されます。このステップは、時間がかかる可能性のあるバックグラウンド計算を実行するために使用されます。非同期タスクのパラメーターは、このステップに渡されます。計算の結果はこのステップで返される必要があり、最後のステップに戻されます。このステップでは、publishProgress(Progress ...)を使用して、1つ以上の進行状況を公開することもできます。これらの値は、UIスレッドのonProgressUpdate(Progress ...)ステップで公開されます。

onProgressUpdate(Progress ...)、publishProgress(Progress ...)の呼び出し後にUIスレッド呼び出されます。実行のタイミングは未定義です。このメソッドは、バックグラウンド計算の実行中に、ユーザーインターフェイスで進行状況を表示するために使用されます。たとえば、プログレスバーをアニメーション化したり、テキストフィールドにログを表示したりするために使用できます。

onPostExecute(Result)、バックグラウンド計算の終了後にUIスレッド呼び出されます。バックグラウンド計算の結果は、パラメーターとしてこのステップに渡されます。

だからあなたは他の場所でそのトーストをする必要があります。たとえば、コールバックメソッドを使用してAsynctask内にインターフェイスを定義できます。

public interface MyTaskInterface {
    public void onNetworkError();
}

AsyncTask内でリスナーを定義します。

private MyTaskInterface listener;

リスナーのゲッターとセッターを追加すると、次のように書くことができます。

if (listener != null) {
    listener.onNetworkError();
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

一部のデータをWebサービスに投稿しようとすると、アプリがクラッシュするのはなぜですか?

分類Dev

私は、データベースからデータを削除しようとすると、リストビューをリフレッシュしていたときにアプリがクラッシュしつつあります

分類Dev

Android pie(API 28)でアプリが強制終了されたときに、ネットワークの状態を検出し、バックグラウンドからビデオデータをアップロードします

分類Dev

Vuex-行をクリックすると、ブートストラップテーブルの行データで状態が変化します

分類Dev

アプリが閉じているときに、サービスクラスからのデータの変化を常にリッスンできますか?

分類Dev

Retrofitを使用してRESTWebサービスを利用するためのシンプルなAndroidクライアント-「サーバーへの接続に失敗しました」というエラーが表示されるのはなぜですか

分類Dev

ストア(アプリの状態)を設計して、アクションやレデューサーなしでストア内のデータを直接変更するにはどうすればよいですか?

分類Dev

Swift:アプリからサファリでURLを開こうとすると、「レンダリングされていないビューのスナップショット..」エラーが発生します

分類Dev

レデューサーがImmutableJSでストアの状態を更新しないのはなぜですか?

分類Dev

Android:カスタムアダプタリストビューにチェックボックスの状態を保存する必要があります

分類Dev

アプリケーションがバックグラウンドプロセスからiOSのアクティブプロセスに移行するときに、編集可能なアラートビューを表示します

分類Dev

いくつかのUIビューがある状態でファクトリシングルリクエストデータを管理する方法

分類Dev

MESIキャッシュコヒーレンスプロトコルでは、データをメモリからフェッチする必要がある場合、キャッシュラインの状態はいつ正確に変更されますか?

分類Dev

リサイクラー ビューでデータを表示するときのエラー:RecyclerView:アダプターが接続されていません。スキップレイアウト

分類Dev

Windows 8.1がインストールされている状態で、ハードディスク上のISOからLinuxディストリビューションを直接インストールしますか?

分類Dev

アプリが強制終了/強制終了(バックグラウンドではない)状態の場合、プッシュ通知を受信するとどのデリゲートメソッドが呼び出されますか?

分類Dev

アプリがフラッターアプリで状態を確認しているときにスプラッシュスクリーンを表示するにはどうすればよいですか?

分類Dev

Android:2つの異なるセルでリストビューをスクロールするとアプリがクラッシュする

分類Dev

ビューコントローラを表示する方法着信コールの場合、デバイスもロックされ、アプリケーションはバックグラウンド状態になりますか?

分類Dev

GPSがインストールされているにもかかわらず、エミュレータのCordovaアプリケーションが「GooglePlayサービスを更新しないとHelloMapは実行されません」とスローします

分類Dev

データベースを開くとアプリがクラッシュするのはなぜですか?

分類Dev

データボリュームをバックアップするときに、dockerが「アクセスが拒否されました」というプロンプトを表示するのはなぜですか?

分類Dev

Reduxに関して、ビューレンダリングは、ストアが初期状態を設定するきっかけとなるものですか?それとも、ストアは最初に最初にセットアップされますか?

分類Dev

デリゲートが機能していない状態で、詳細ビューからマスタービューにデータを渡す

分類Dev

デスクトップ環境のアプリケーションが他のDEのモジュール、ライブラリなどをロードしているかどうかをどのように知ることができますか?

分類Dev

スリープ状態になると、ラップトップの強制がシャットダウンしてから再起動します

分類Dev

12.04から14.04にアップグレードすると、スプラッシュが「リゾルバー状態を復元しています...」でスタックします。

分類Dev

ExcelのPowerQuery From Webオプションを使用して、さまざまなサイトからニュースヘッドラインを抽出し、データをリアルタイムで保持するにはどうすればよいですか?

分類Dev

componentDidMountで状態を設定すると、ReactアプリがAPIからのデータを表示しません

Related 関連記事

  1. 1

    一部のデータをWebサービスに投稿しようとすると、アプリがクラッシュするのはなぜですか?

  2. 2

    私は、データベースからデータを削除しようとすると、リストビューをリフレッシュしていたときにアプリがクラッシュしつつあります

  3. 3

    Android pie(API 28)でアプリが強制終了されたときに、ネットワークの状態を検出し、バックグラウンドからビデオデータをアップロードします

  4. 4

    Vuex-行をクリックすると、ブートストラップテーブルの行データで状態が変化します

  5. 5

    アプリが閉じているときに、サービスクラスからのデータの変化を常にリッスンできますか?

  6. 6

    Retrofitを使用してRESTWebサービスを利用するためのシンプルなAndroidクライアント-「サーバーへの接続に失敗しました」というエラーが表示されるのはなぜですか

  7. 7

    ストア(アプリの状態)を設計して、アクションやレデューサーなしでストア内のデータを直接変更するにはどうすればよいですか?

  8. 8

    Swift:アプリからサファリでURLを開こうとすると、「レンダリングされていないビューのスナップショット..」エラーが発生します

  9. 9

    レデューサーがImmutableJSでストアの状態を更新しないのはなぜですか?

  10. 10

    Android:カスタムアダプタリストビューにチェックボックスの状態を保存する必要があります

  11. 11

    アプリケーションがバックグラウンドプロセスからiOSのアクティブプロセスに移行するときに、編集可能なアラートビューを表示します

  12. 12

    いくつかのUIビューがある状態でファクトリシングルリクエストデータを管理する方法

  13. 13

    MESIキャッシュコヒーレンスプロトコルでは、データをメモリからフェッチする必要がある場合、キャッシュラインの状態はいつ正確に変更されますか?

  14. 14

    リサイクラー ビューでデータを表示するときのエラー:RecyclerView:アダプターが接続されていません。スキップレイアウト

  15. 15

    Windows 8.1がインストールされている状態で、ハードディスク上のISOからLinuxディストリビューションを直接インストールしますか?

  16. 16

    アプリが強制終了/強制終了(バックグラウンドではない)状態の場合、プッシュ通知を受信するとどのデリゲートメソッドが呼び出されますか?

  17. 17

    アプリがフラッターアプリで状態を確認しているときにスプラッシュスクリーンを表示するにはどうすればよいですか?

  18. 18

    Android:2つの異なるセルでリストビューをスクロールするとアプリがクラッシュする

  19. 19

    ビューコントローラを表示する方法着信コールの場合、デバイスもロックされ、アプリケーションはバックグラウンド状態になりますか?

  20. 20

    GPSがインストールされているにもかかわらず、エミュレータのCordovaアプリケーションが「GooglePlayサービスを更新しないとHelloMapは実行されません」とスローします

  21. 21

    データベースを開くとアプリがクラッシュするのはなぜですか?

  22. 22

    データボリュームをバックアップするときに、dockerが「アクセスが拒否されました」というプロンプトを表示するのはなぜですか?

  23. 23

    Reduxに関して、ビューレンダリングは、ストアが初期状態を設定するきっかけとなるものですか?それとも、ストアは最初に最初にセットアップされますか?

  24. 24

    デリゲートが機能していない状態で、詳細ビューからマスタービューにデータを渡す

  25. 25

    デスクトップ環境のアプリケーションが他のDEのモジュール、ライブラリなどをロードしているかどうかをどのように知ることができますか?

  26. 26

    スリープ状態になると、ラップトップの強制がシャットダウンしてから再起動します

  27. 27

    12.04から14.04にアップグレードすると、スプラッシュが「リゾルバー状態を復元しています...」でスタックします。

  28. 28

    ExcelのPowerQuery From Webオプションを使用して、さまざまなサイトからニュースヘッドラインを抽出し、データをリアルタイムで保持するにはどうすればよいですか?

  29. 29

    componentDidMountで状態を設定すると、ReactアプリがAPIからのデータを表示しません

ホットタグ

アーカイブ