我正在尝试从服务器获取消息以显示在吐司中,但它不会出现。客户端从服务器接收消息没有任何错误。我尝试在onpost中打开UI线程但它不起作用
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 :(得分:0)
可能与上下文有关。
过去我遇到过一些问题,因为getApplicationContext对某些事情不起作用,虽然不记得是什么形式。
在调用异步任务的活动中,不要使用getApplicationContext,而是在构造函数调用中放置this
。例如,假设您要从MainActivity转到,请将行new test().execute();
更改为新test(MainActivity.this).execute();
然后在async类中创建构造函数为
public test(Context context)
并将全局类变量设置为context的值,然后在toast.makeText中使用它,而不是从getApplicationContext返回的值。
另外看看logcat,看看是否有任何错误或异常被抛出,也可能值得在onpostexecute方法中添加一个日志行,只是为了仔细检查你是否定义了那里。
答案 1 :(得分:0)
在 test 类中创建一个构造函数,该构造函数接收上下文并在Toast.makeText中使用该上下文。将主机活动上下文传递给该构造函数。
getApplicationContext()是一个Context类方法,AsyncTask不是该类固有的。我假设您在一个可以调用该方法的范围内,但该范围上下文在您调用Toast.makeText方法的范围内无效。