非活动类中AsyncTask中的Toast



我有一个非活动类,它包含一个调用URL的AsyncTask。如果由于某些原因连接超时,我想通过发布Toast让用户知道这一点。但我就是找不到任何上下文。

如何才能做到这一点?

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);
    }
}

(超时代码基于kuester2000的此答案)

步骤#1:向接受ContextRPicall添加构造函数,并将其存储在数据成员中。

步骤#2:使用onPostExecute()中的Context来显示您的Toast

步骤#3:在创建RPicall的实例时传入合适的Context

定义一个以Context对象为参数的构造函数,并将其保留为类成员。例如:

class RPicall extends AsyncTask<String, String, Void> {
       private final Context mContext;
       public RPicall(Context c) {
          mContext = c;
       }
 }

最新更新