2017-06-14 13 views
0

トーストで表示するようにサーバーからメッセージを取得しようとしていますが、表示されません。クライアントがどのerrors.Iせずにサーバーからメッセージを受け取るには、onpostにUIスレッドを開いて試してみましたが、それはトーストがasynctaskに表示されない

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main2); 
    new test().execute(); 

} 
public class test extends AsyncTask<String,String,String>{ 


    @Override 
    protected String doInBackground(String... params) { 

     try 
     { 
      socket = new Socket("ip", port); 
      OutputStream outToServer = socket.getOutputStream(); 
      DataOutputStream out = new DataOutputStream(outToServer); 
      Log.i(debugString, "Connected_reg!"); 
      out.writeUTF("3"); 


      InputStream inFromServer = socket.getInputStream(); 
      DataInputStream in = new DataInputStream(inFromServer); 
      Log.i(debugString, in.readUTF()); 
      string= in.readUTF(); 

     } 
     catch (Exception e) { 
      Log.e(debugString, e.getMessage()); 
     } 


     return null; 
    } 


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

    @Override 
    protected void onPostExecute(String s) { 

     //super.onPostExecute(s); 

       Context context = getApplicationContext(); 
       CharSequence text = string; 
       int duration = Toast.LENGTH_SHORT; 
       Toast toast = Toast.makeText(context, text, duration); 
       toast.show(); 
    } 


} 
+0

あなたが「Context」の問題を抱えているようです。たぶん[この記事](https://possiblemobile.com/2013/06/context/) – Pelocho

答えて

0

それは文脈をどうするかもしれない動作しませんでした。

私は以前、特定のもののために働いていないgetApplicationContextで問題を抱えていましたが、私の頭の上のどのような形が覚えていないのです。

getApplicationContextを使用する代わりに、非同期タスクを呼び出すアクティビティでは、thisをコンストラクタ呼び出しに指定します。たとえば、あなたが新しいtest(MainActivity.this).execute();

にラインnew test().execute();を変更MainActivityから行っていると仮定すると、その後、非同期クラスに

public test(Context context)としてコンストラクタを作成して、コンテキストの値にグローバルクラス変数を設定し、使用しますこれはgetApplicationContextから返されるものではなく、toast.makeTextにあります。

また、logcatを見てください。エラーや例外がスローされているかどうかを確認してください。また、onpostexecuteメソッドにログ行を追加して、そこに確実に入り込んでいるかどうかを確認してください。

+1

onPostExecuteはUIスレッド上で動作します。 https://developer.android.com/reference/android/os/AsyncTask.html#onPostExecute(Result) –

+0

申し訳ありませんが、忘れてしまいました – Boardy

0

コンテキストを受け取り、そのコンテキストをToast.makeTextで使用するクラスのコンストラクタをで作成します。ホストアクティビティコンテキストをそのコンストラクタに渡します。

getApplicationContext()はContextクラスのメソッドで、AsyncTaskはそのクラスに固有のものではありません。私はあなたがそのメソッドを呼び出すことができるスコープにいると思いますが、そのスコープコンテキストはToast.makeTextメソッドを呼び出すスコープでは有効ではありません。

関連する問題