土司AsyncTask的非活动类 [英] Toast in AsyncTask in non Activity class

查看:199
本文介绍了土司AsyncTask的非活动类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个包含调用一个URL的AsyncTask的非活动类。
如果连接超时因为某些原因,我希望让用户知道这张贴敬酒。
但我就是不能让任何上下文。

如何achive呢?

RPIcall.class

 进口android.os.AsyncTask;
进口android.util.Log;进口org.apache.http.Htt presponse;
进口org.apache.http.client.ClientProtocolException;
进口org.apache.http.client.methods.HttpGet;
进口org.apache.http.conn.HttpHostConnectException;
进口org.apache.http.impl.client.DefaultHttpClient;
进口org.apache.http.params.BasicHttpParams;
进口org.apache.http.params.HttpConnectionParams;
进口org.apache.http.params.HttpParams;进口java.io.IOException异常;类RPicall扩展的AsyncTask<字符串,字符串,太虚> {    @覆盖
    保护无效doInBackground(字符串... URI){        INT timeoutSocket = 3000;
        INT timeoutConnection = 3000;        尝试{            Log.v(电话网址:URI [0]);            HTTPGET HTTPGET =新HTTPGET(URI [0]);
            的HttpParams httpParameters =新BasicHttpParams();
            //直到建立连接以毫秒为单位设置超时。
            //默认值是零,这意味着未使用的超时。            HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection);
            //设置默认的套接字超时(SO_TIMEOUT)
            //毫秒是用于等待数据的超时。            HttpConnectionParams.setSoTimeout(httpParameters,timeoutSocket);            DefaultHttpClient的HttpClient =新DefaultHttpClient(httpParameters);
            HTT presponse响应= httpClient.execute(HTTPGET);        }赶上(ClientProtocolException E){
            //这里连接超时excepion
            //Toast.makeText(你的连接已逾时,Toast.LENGTH_SHORT).show();
            Log.v(服务器不可达,URI [0]);
            publishProgress(超时);        }赶上(HttpHostConnectException E){            Log.e(服务器不可达,URI [0]);        }        赶上(IOException异常五){
            e.printStackTrace();
        }
        返回null;
    }    @覆盖
    保护无效onPostExecute(虚空结果){
        super.onPostExecute(结果);
        字符串测试=测试;
        Log.v(完了,测试);    }
}


解决方案

步骤1:构造函数添加到 RPicall ,需要一个上下文,将其存储在数据成员。

第2步:使用上下文 onPostExecute()来显示你的吐司

第三步:通过在合适的上下文当你创建一个实例 RPicall

I have a non Activity class which contains an AsyncTask which calls an URL. If the Connection Timeouts for some reasons, I want to let the user know this by posting a Toast. But I just can't get any Context.

How can achive this?

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

    }
}

解决方案

Step #1: Add a constructor to RPicall that takes a Context, storing it in a data member.

Step #2: Use that Context in onPostExecute() to display your Toast.

Step #3: Pass in a suitable Context when you create an instance of RPicall.

这篇关于土司AsyncTask的非活动类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆