2017-06-14 101 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

好像你正在遭受'上下文'問題。也許[本文](https://possiblemobile.com/2013/06/context/)可以幫助您 – Pelocho

回答

0

這可能是與上下文做。

我以前遇到過問題,getApplicationContext不能用於某些特定的事情,儘管不記得我的頭頂是什麼形式。

而不是使用getApplicationContext,在調用異步任務的活動中,將this放在構造函數調用中。例如,假設你是從MainActivity去改線new test().execute();test(MainActivity.this).execute();

然後在異步類創建構造函數

public test(Context context),並設置全局類變量是上下文的值,然後使用這在你的toast.makeText中,而不是getApplicationContext返回的內容。

也看看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方法。