【问题标题】:AsyncTask, doInBackground never runs in androidAsyncTask,doInBackground 永远不会在 android 中运行
【发布时间】:2013-04-25 22:53:20
【问题描述】:

当我尝试启动我的 doinbackground 以等待传入消息时,它从未真正运行过它只是跳过它

public class Incomingdata extends AsyncTask<Void,Void,Void>
{
    Socket s  ;
    String input;

    public Incomingdata(Socket socket)
    {   
        super();
        this.s = socket;
    }

    @Override
    protected Void doInBackground(Void... params) 
    {
        Log.i("ddd","Got here before try");
        try
        {   
            InputStream in = s.getInputStream();
            Scanner r = new Scanner(in);
            Log.i("Info",s.getPort()+"");
            Log.i("ddd","Got here");
            while(s.isConnected() && r.hasNext())
            {
                String input =r.nextLine(); 
            }
        }
        catch (UnknownHostException e) 
        {
               e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch(NoSuchElementException e)
        {
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void input)
    {
        System.out.println("123"+input);
    }

}

这是我的日志猫

 java.net.Socket.startupSocket(Socket.java:724)
04-25 23:50:26.659: W/System.err(28882):    at java.net.Socket.<init>(Socket.java:263)
04-25 23:50:26.659: W/System.err(28882):    at com.example.handy.myComs.sending_data(myComs.java:23)
04-25 23:50:26.659: W/System.err(28882):    at com.example.handy.MainActivity.readSms(MainActivity.java:277)
04-25 23:50:26.659: W/System.err(28882):    at com.example.handy.MainActivity$1.onClick(MainActivity.java:92)
04-25 23:50:26.659: W/System.err(28882):    at android.view.View.performClick(View.java:2485)
04-25 23:50:26.659: W/System.err(28882):    at android.view.View$PerformClick.run(View.java:9080)
04-25 23:50:26.659: W/System.err(28882):    at android.os.Handler.handleCallback(Handler.java:587)
04-25 23:50:26.659: W/System.err(28882):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-25 23:50:26.659: W/System.err(28882):    at android.os.Looper.loop(Looper.java:130)
04-25 23:50:26.659: W/System.err(28882):    at android.app.ActivityThread.main(ActivityThread.java:3687)
04-25 23:50:26.659: W/System.err(28882):    at java.lang.reflect.Method.invokeNative(Native Method)
04-25 23:50:26.659: W/System.err(28882):    at java.lang.reflect.Method.invoke(Method.java:507)
04-25 23:50:26.659: W/System.err(28882):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
04-25 23:50:26.659: W/System.err(28882):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
04-25 23:50:26.659: W/System.err(28882):    at dalvik.system.NativeStart.main(Native Method)
04-25 23:50:26.729: I/System.out(28882): 123null

这就是我所说的

public class myComs 
{
    private static int i = 0;

    public static void sending_data(String ipAddress, String message)
    {
        try
        {
            InetAddress inet = InetAddress.getByName(ipAddress);
            Socket s = new Socket(inet, 2000);
            OutputStream o = s.getOutputStream();
            PrintWriter p = new PrintWriter(o);
            while(i<1)
            {
                new Incomingdata(s).execute();
                i++;
            }
            p.println(message);
            p.flush();
        }
        catch (UnknownHostException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

正如你从 123null 看到的那样,它永远不会等待任何帮助,因为我在这方面已经很长时间了,而且速度很快

谢谢

更新 是的,我通过并知道它正在获取端口,但它仍然没有等待传入数据它刚刚完成

【问题讨论】:

  • 显示您调用的代码部分。
  • Log.i("ddd","Got here before try"); 显示了吗?
  • 看起来你的代码在你调用 AsyncTask 之前就失败了。 at com.example.handy.myComs.sending_data(myComs.java:23) 创建 Socket 时。
  • 你看到的事情是我没有在那里创建套接字,而且在我尝试这个 ASYNCTASK 之前它似乎总是在那里抛出一个警告。该程序正在做我所要求的一切,就像假设的那样
  • @PaulPandaboyDennehy 尝试在该行中使用System.out.println("Got here before try");。如果它显示,一切都应该是有意义的。

标签: android sockets android-asynctask client


【解决方案1】:

我注意到你正在使用

System.out.println("123"+input);

用于一种类型的调试,而 Log.i 用于其他类型的调试。也许它正在工作,但您的日志视图设置不正确,无法查看 Log.i。

如果您使用System.out 而不是Log.i,您能看到其他消息吗?

【讨论】:

  • 对不起,只是累了,它仍然是直的 System.out.println("123"+input);甚至从未进入 try doInBackground
  • 你改了这条线? Log.i("ddd","在尝试之前到达这里"); to System.out.println("Got here before try") ?
  • 是的,我做了,但仍然没有,它仍然直接进入 System.out.println("123"+input);
【解决方案2】:

您是否同时使用多个异步任务?因为您的代码似乎没问题。 Async Task 模型在 2.3 之后发生了变化,它禁止它们并行运行。请检查thisthis SO 问题。

【讨论】:

  • 是的,我正在运行 2.3.5 但不,我只是尝试运行一个 AsyncTask,即让套接字等待并侦听传入数据
【解决方案3】:

我的问题是我像布偶一样多次创建套接字,所以我只需要创建一次套接字,然后多次调用它,现在它看起来像一个魅力

这是我的异步任务

public class Incomingdata extends AsyncTask<Void,Void,String>
{

    Socket s  ;
    String input;

    public Incomingdata(Socket socket)
    {   
        super();
        this.s = socket;


    }





    @Override
    protected String doInBackground(Void... params) 
    {Log.i("ddd","Got here before try");
        try
        {   System.out.println("Got here");
            InputStream in = s.getInputStream();
            Scanner r = new Scanner(in);
            Log.i("Info",s.getPort()+"");
            Log.i("ddd","Got here");        

            input =r.nextLine();    


        }
        catch (UnknownHostException e) 
        {

               e.printStackTrace();
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        catch(NoSuchElementException e)
        {
            e.printStackTrace();
        }
        return input ;
    }

    @Override
    protected void onPostExecute(String input)
    {

        String number = input.substring(0, 21).trim();
        String message = input.substring(20);
        System.out.println(""+input);
        sendSMS(number,message);
        new Incomingdata(s).execute();

    }

这是我创建套接字的地方

    public class myComs
{
    private static int i = 0;
    private static InetAddress inet;
    private static Socket s;
    private static OutputStream o;
    private static PrintWriter p;

    public static void createSocket(String ipAddress)
    {
        try
        {
            inet = InetAddress.getByName(ipAddress);

            s = new Socket(inet, 2000);
            o = s.getOutputStream();
            p = new PrintWriter(o);
            new Incomingdata(s).execute();
        }
        catch (Exception e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

    public static void sending_data(String message)
    {


        p.println(message);
        p.flush();

    }

}

然后在我的 MainActivity 上

   myComs.createSocket(getMyIp());

从我从文本字段中的输入创建的 set/get 中获取我的 Myip 谢谢你的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多