2012-05-17 169 views
2

我写了一个代码从互联网下载一些数据。比我想把它放入asyncTask。然后下载停止工作。它看起来像不能完成尝试{}部分,所以跳过豁免。Android:AsyncTask和阅读互联网数据

从主要活动“Nekaj”我调用loadData()类,它扩展了AsyncData。从那里我尝试命令里面叫“oto”类。 “oto”类用于从互联网上读取内容并返回字符串数组。当我直接从“Nekaj”类调用oto类时,这起作用。我使用AsyncTask做了什么错误? 下面是代码:

public class Nekaj extends Activity { 

TextView Tkolo, Tbroj1; 
String[] brojevi_varijabla; 
String privremena_varijabla = null; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.bez_provjere_739); 
    Tkolo = (TextView) findViewById(R.id.Xkolo); 
    Tbroj1 = (TextView) findViewById(R.id.Xbroj1); 

    /* 
    * try { privremena_varijabla = test.kolo_739(); 
    * Tkolo.setText(privremena_varijabla); } catch (Exception e) { // TODO 
    * Auto-generated catch block e.printStackTrace(); } 
    */ 

    new loadData().execute(); 
} 

public class loadData extends AsyncTask<String, Integer, String> { 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 

     Oto test = new Oto(); 

     try { 
      brojevi_varijabla = test.brojevi_739(); 
      if (Integer.valueOf(brojevi_varijabla[0]) > 10) { 
       Tbroj1.setText("" + brojevi_varijabla[0]); 
      } else { 
       Tbroj1.setText(" " + brojevi_varijabla[0]); 
      } 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

public class Oto { 

    public String[] brojevi_739() throws Exception { 

     int i = 0; 
     int uvjet = 0; 
     int varijabla = 0; 
     char[] znak = { '>', '<' }; 
     BufferedReader in = null; 
     String data[] = null; 
     String provjera = "date-info"; 
     int[] polje = new int[2]; 

     try { 
      HttpClient klijent = new DefaultHttpClient(); 
      URI webstranica = new URI(
        "https://www.aaa.bb"); 
      HttpGet zahtjev = new HttpGet(); 
      zahtjev.setURI(webstranica); 
      HttpResponse odgovor = klijent.execute(zahtjev); 
      in = new BufferedReader(new InputStreamReader(odgovor 
        .getEntity().getContent())); 
      StringBuffer brojevi = new StringBuffer(""); 
      String brojevi_string = null; 
      String neki_string = null; 
      String red = ""; 

      in.skip(21000); 
      while ((red = in.readLine()) != null) { 
       varijabla = red.indexOf(provjera); 

       if (varijabla != -1) { 

        // 1. KOLO 
        if (uvjet == 0) { // onda sadrži taj 
             // substring 
             // !!!! 
         red = in.readLine(); // sada string red sadrži ono 
               // što 
               // želim, još moram samo to 
               // izrezati!! 
         do { 
          if (i == 0) { 
           varijabla = red.indexOf(znak[i]); 
          } 

          else { 
           varijabla = red.indexOf(znak[i], polje[0]); 
          } 

          if (varijabla != -1) // ako taj znak postoji u 
                // stringu 
          { 
           if (i == 0) { 
            polje[i] = varijabla + 1; 
           } 

           else { 
            polje[i] = varijabla; 
           } 
           i++; 
          } 

         } while (i <= 1); 

         neki_string = red.substring(polje[0], polje[1]); 
         Tkolo.setText(neki_string); 

         provjera = "Dobitna kombinacija"; 
         uvjet++; 
         continue; 
        } 


       } 
      } 

      in.close(); 

      brojevi_string = brojevi.toString(); 

      data = brojevi_string.split("\n"); 

      return data; 

     } finally { 
      if (in != null) { 
       try { 
        in.close(); 
        return data; 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 


}} 
+0

你只用的AsyncTask的“doInBackground”的方法,你为什么不使用preExecute和postExecute方法。而不是在你的AsyncTask类中实例化你的Oto类,你不能直接使用AsyncTask类吗?它有很多优点。 – YuDroid

+0

您不应该直接从doInBackground()中访问您的UI元素请参阅:https://developer.android.com/reference/android/os/AsyncTask.html publishProgress(Progres ...)用于此 – Weeman

回答

1

你所做错了,是Tbroj1.setText()在doInBackground()方法中。你所要做的就是用onPostExecute方法张贴在用户界面中的数据:

public class loadData extends AsyncTask<String, Integer, Boolean> { 
protected Long doInBackground(String... arg0) { 
    Oto test = new Oto(); 
    Boolean result = false; 

    try { 
     brojevi_varijabla = test.brojevi_739(); 
     result = true; 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return result; 
} 


protected void onPostExecute(Boolean result) { 
    if(result){ 
     if (Integer.valueOf(brojevi_varijabla[0]) > 10) { 
      Tbroj1.setText("" + brojevi_varijabla[0]); 
     } else { 
      Tbroj1.setText(" " + brojevi_varijabla[0]); 
     } 
    } 

} 
} 
0

使用onPostExecute(无效RESULT1){}

赶上结果,并进行那边

1

其实,你试图在doInBackGround()更新UI所需采取的行动你的AsyncTask,所以它不允许(doInBack ..在非UI线程中运行..),所以把UI更新代码放在的AsyncTask ..

试试这个,让我知道发生什么事..

public class loadData extends AsyncTask<String, Integer, String> { 

    @Override 
    protected String doInBackground(String... arg0) { 
     // TODO Auto-generated method stub 
     Oto test = new Oto(); 
     try { 
      brojevi_varijabla = test.brojevi_739();  
      if(brojevi_varijabla != null) 
      return brojevi_varijabla[0]; 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return null; 
    } 

@Override 
    protected void onPostExecute(String result) 
    { 
     if(result != null) 
      { 
      if (Integer.valueOf(result) > 10) { 
       Tbroj1.setText("" + result; 
      } else { 
       Tbroj1.setText(" " + result); 
      } 
      } 
    } 
} 
+0

我遇到问题。我的Oto类返回一个String []类型。而且我还希望doInBackground方法返回String [],因为我需要用onPostExecute和.setText放置一个XML。如果我尝试用方法doInBackground返回String [],程序会给我一个错误。??????? – speedyTeh

+0

是的你可以。只要从doInback返回String [],并且将其作为onPostExecute()中的参数。然后在onPostExecute()中使用它。 – user370305

0

您不能直接在非UI(背景)的线程,这就是doInBackground()始终运行操作UI元素。使用AsyncTask的常用方法是获取doInBackground()中的数据,将其作为值返回,然后处理onPostExecute()中的UI更改。例如:

public class loadData extends AsyncTask<String, Integer, String> { 

@Override 
protected String doInBackground(String... arg0) { 
    Oto test = new Oto(); 

    try { 
     brojevi_varijabla = test.brojevi_739(); 
     if (Integer.valueOf(brojevi_varijabla[0]) > 10) { 
      return "" + brojevi_varijabla[0]; 
     } else { 
      return " " + brojevi_varijabla[0]; 
     } 

    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    return null; 
} 

@Override 
protected void onPostExecute(String result) { 
    super.onPostExecute(result); 
    if (result != null) Tbroj1.setText(result); 
} 

}