2017-11-11 179 views
0

因此,我有一個活動讓我的服務器讀取一個文本文件。該文本文件包含一行包含包名稱的文本。我的目標是獲取軟件包名稱,然後使用軟件包名稱獲取服務器上txt文件中指定軟件包的versionCode。 這裏是獲取來自服務器的txt文件類:如何從服務器上的txt文件返回軟件包名稱

public class getter extends Activity { 
Activity context; 
TextView txtview; 
ProgressDialog pd; 
protected void onCreate(Bundle savedInstanceState) { 
    //TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_get); 
    context=this; 


} 





public void onStart(){ 
    super.onStart(); 

    BackTask bt=new BackTask(); 
    bt.execute("http://1.2.3.4/test.txt"); 


} 

//background process to download the file from internet 
public static class BackTask extends AsyncTask<String,Integer,Void>{ 
    String text=""; 
    protected void onPreExecute(){ 
     super.onPreExecute(); 
     //display progress dialog 

    } 



    protected Void doInBackground(String...params){ 
     URL url; 
     try { 
      //create url object to point to the file location on internet 
      url = new URL(params[0]); 
      //make a request to server 
      HttpURLConnection con=(HttpURLConnection)url.openConnection(); 
      //get InputStream instance 
      InputStream is=con.getInputStream(); 
      //create BufferedReader object 
      BufferedReader br=new BufferedReader(new InputStreamReader(is)); 
      String line; 
      //read content of the file line by line 
      while((line=br.readLine())!=null){ 
       text+=line; 
      } 

      br.close(); 

     }catch (Exception e) { 
      e.printStackTrace(); 
      //close dialog if error occurs 

     } 

     return null; 

    } 


    protected void onPostExecute(Void result){ 
     String packageName = text; 


    } 


} 
public String getPackageName(Context mContext) { 
    if (mContext != null) { 
     BackTask bt=new BackTask(); 
     bt.execute("http://1.2.3.4/test.txt"); 
    } 
    return ""; 
} 
} 

,這是應該從服務器上指定的包拿到的versionCode:

public static int getinstVersionCode(Context mContext) { 
    if (mContext != null) { 
     try { 
      getter.BackTask bt=new getter.BackTask(); 
      bt.execute("http://1.2.3.4/test.txt"); 
      return mContext.getPackageManager().getPackageInfo(String.valueOf(new getter.BackTask().execute("http://1.2.3.4/test.txt")), 0).versionCode; 
     } catch (PackageManager.NameNotFoundException ignored) { 
     } 
    } 
    return 0; 
} 

爲什麼沒有這個回報服務器上軟件包名稱的versionCode?

我認爲錯誤在於下面的函數,但我不確定。

返回mContext.getPackageManager()getPackageInfo(將String.valueOf(新getter.BackTask()執行( 「http://1.2.3.4/test.txt」)),0).versionCode。

+0

你有什麼異常嗎?你能否詳細描述一下發生的事情。另外,getter.BackTask()。execute返回null,它應該返回從服務器獲得的文本。它應該返回一個字符串,並且不會像你指定的那樣無效 – user3362334

+0

你有兩次'new getter.BackTask()。execute(「http://1.2.3.4/test.txt」))''。爲什麼?看起來不太好。此外,您無法以這種方式從AsyncTask獲得結果。你應該在onPostExecute中處理doInBackground的結果。只有在那裏! – greenapps

回答

0

一個問題是,您的變量packageNameonPostExecute是該方法的本地。所以即使該方法被正確調用,其他方法也不會看到該值。

您可以嘗試聲明packageNameBackTask的頂部附近,在您聲明變量text附近。

則此方法更改爲:

protected void onPostExecute(Void result){ 
    packageName = text; 
} 

免責聲明:我沒有嘗試加載和運行代碼或此修復程序!

+0

我是否正確地調用它:return mContext.getPackageManager()。getPackageInfo(String.valueOf(new getter.BackTask()。execute(「http://1.2.3.4/test.txt」)),0)。的versionCode; – Zuuchq

+0

我看不出它是否完全正確。爲了調試的目的,你可以把這一行分成幾行: 'return mContext.getPackageManager()。getPackageInfo(String.valueOf(new getter.BackTask()。execute(「http://1.2.3.4/test.txt」 )),0).versionCode;' 而不是僅僅返回它。然後你可以在'return'之前記錄'execute'部分的輸出。你現在有什麼讓你很難看到你是否正在閱讀包名。 – akubot

+0

另外,您是否看到Bobby Prabowo的建議?你可以嘗試一下,並解決我之前提到的局部變量問題。 – akubot

0

如果網絡沒有任何問題,那麼想,因爲你使用的的AsyncTask =>文本

應使用內部變量doInBackgroundonPostExecute之間溝通的問題引起的在返回值doInBackground到它的AsyncTask傳遞給onPostExecute

變化

//background process to download the file from internet 
public static class BackTask extends AsyncTask<String,Integer,String>{ 
    protected void onPreExecute(){ 
    super.onPreExecute(); 
    //display progress dialog 

} 



protected String doInBackground(String...params){ 
    URL url; 
    String text; 
    try { 
     //create url object to point to the file location on internet 
     url = new URL(params[0]); 
     //make a request to server 
     HttpURLConnection con=(HttpURLConnection)url.openConnection(); 
     //get InputStream instance 
     InputStream is=con.getInputStream(); 
     //create BufferedReader object 
     BufferedReader br=new BufferedReader(new InputStreamReader(is)); 
     String line; 
     //read content of the file line by line 
     while((line=br.readLine())!=null){ 
      text+=line; 
     } 

     br.close(); 

    }catch (Exception e) { 
     e.printStackTrace(); 
     //close dialog if error occurs 

    } 

    return text; 

} 


protected void onPostExecute(String resultText){ 
    String packageName = resultText; 


} 


} 
0

你有兩次

new getter.BackTask().execute("http://1.2.3.4/test.txt")). 

爲什麼?看起來不太好。

而且你不能從一個的AsyncTask得到的結果與

String.valueOf(new getter.BackTask().execute("http://1.2.3.4/test.txt")) 

您應該處理doInBackground的結果onPostExecute。只有在那裏!

相關問題