在非 Activity class 中的 AsyncTask 中吐司
Toast in AsyncTask in non Activity class
我有一个非 Activity class,它包含一个调用 URL 的 AsyncTask。
如果由于某些原因连接超时,我想通过张贴祝酒词让用户知道这一点。
但我就是无法获得任何上下文。
如何实现?
RPIcall.class
import android.os.AsyncTask;
import android.util.Log;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import java.io.IOException;
class RPicall extends AsyncTask<String, String, Void> {
@Override
protected Void doInBackground(String... uri) {
int timeoutSocket = 3000;
int timeoutConnection = 3000;
try{
Log.v("call URL: ", uri[0]);
HttpGet httpGet = new HttpGet(uri[0]);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(httpGet);
} catch (ClientProtocolException e) {
//Here Connection TimeOut excepion
//Toast.makeText(, "Your connection timedout", Toast.LENGTH_SHORT).show();
Log.v("Server not Reachable: ", uri[0]);
publishProgress("TimeOut");
} catch (HttpHostConnectException e) {
Log.e("Server not Reachable: ", uri[0]);
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
String test = "test";
Log.v("finished: ", test);
}
}
第 1 步:向 RPicall
添加一个构造函数,该构造函数采用 Context
,将其存储在数据成员中。
第 2 步:使用 onPostExecute()
中的 Context
来显示您的 Toast
。
第 3 步:在创建 RPicall
的实例时传入合适的 Context
。
定义一个以 Context 对象为参数的构造函数,并将其保留为 class 成员。例如:
class RPicall extends AsyncTask<String, String, Void> {
private final Context mContext;
public RPicall(Context c) {
mContext = c;
}
}
我有一个非 Activity class,它包含一个调用 URL 的 AsyncTask。 如果由于某些原因连接超时,我想通过张贴祝酒词让用户知道这一点。 但我就是无法获得任何上下文。
如何实现?
RPIcall.class
import android.os.AsyncTask;
import android.util.Log;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.conn.HttpHostConnectException;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import java.io.IOException;
class RPicall extends AsyncTask<String, String, Void> {
@Override
protected Void doInBackground(String... uri) {
int timeoutSocket = 3000;
int timeoutConnection = 3000;
try{
Log.v("call URL: ", uri[0]);
HttpGet httpGet = new HttpGet(uri[0]);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used.
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
DefaultHttpClient httpClient = new DefaultHttpClient(httpParameters);
HttpResponse response = httpClient.execute(httpGet);
} catch (ClientProtocolException e) {
//Here Connection TimeOut excepion
//Toast.makeText(, "Your connection timedout", Toast.LENGTH_SHORT).show();
Log.v("Server not Reachable: ", uri[0]);
publishProgress("TimeOut");
} catch (HttpHostConnectException e) {
Log.e("Server not Reachable: ", uri[0]);
}
catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
String test = "test";
Log.v("finished: ", test);
}
}
第 1 步:向 RPicall
添加一个构造函数,该构造函数采用 Context
,将其存储在数据成员中。
第 2 步:使用 onPostExecute()
中的 Context
来显示您的 Toast
。
第 3 步:在创建 RPicall
的实例时传入合适的 Context
。
定义一个以 Context 对象为参数的构造函数,并将其保留为 class 成员。例如:
class RPicall extends AsyncTask<String, String, Void> {
private final Context mContext;
public RPicall(Context c) {
mContext = c;
}
}